在Django的上下文中设置变量的方法


Posted in Python onJuly 20, 2015

前一节的例子只是简单的返回一个值。 很多时候设置一个模板变量而非返回值也很有用。 那样,模板作者就只能使用你的模板标签所设置的变量。

要在上下文中设置变量,在 render() 函数的context对象上使用字典赋值。 这里是一个修改过的 CurrentTimeNode ,其中设定了一个模板变量 current_time ,并没有返回它:

class CurrentTimeNode2(template.Node):
  def __init__(self, format_string):
    self.format_string = str(format_string)

  def render(self, context):
    now = datetime.datetime.now()
    context['current_time'] = now.strftime(self.format_string)
    return ''

(我们把创建函数do_current_time2和注册给current_time2模板标签的工作留作读者练习。)

注意 render() 返回了一个空字符串。 render() 应当总是返回一个字符串,所以如果模板标签只是要设置变量, render() 就应该返回一个空字符串。

你应该这样使用这个新版本的标签:

{% current_time2 "%Y-%M-%d %I:%M %p" %}
<p>The time is {{ current_time }}.</p>

但是 CurrentTimeNode2 有一个问题: 变量名 current_time 是硬编码的。 这意味着你必须确定你的模板在其它任何地方都不使用 {{ current_time }} ,因为 {% current_time2 %} 会盲目的覆盖该变量的值。

一种更简洁的方案是由模板标签来指定需要设定的变量的名称,就像这样:

{% get_current_time "%Y-%M-%d %I:%M %p" as my_current_time %}
<p>The current time is {{ my_current_time }}.</p>

为此,你需要重构编译函数和 Node 类,如下所示:

import re

class CurrentTimeNode3(template.Node):
  def __init__(self, format_string, var_name):
    self.format_string = str(format_string)
    self.var_name = var_name

  def render(self, context):
    now = datetime.datetime.now()
    context[self.var_name] = now.strftime(self.format_string)
    return ''

def do_current_time(parser, token):
  # This version uses a regular expression to parse tag contents.
  try:
    # Splitting by None == splitting by spaces.
    tag_name, arg = token.contents.split(None, 1)
  except ValueError:
    msg = '%r tag requires arguments' % token.contents[0]
    raise template.TemplateSyntaxError(msg)

  m = re.search(r'(.*?) as (\w+)', arg)
  if m:
    fmt, var_name = m.groups()
  else:
    msg = '%r tag had invalid arguments' % tag_name
    raise template.TemplateSyntaxError(msg)

  if not (fmt[0] == fmt[-1] and fmt[0] in ('"', "'")):
    msg = "%r tag's argument should be in quotes" % tag_name
    raise template.TemplateSyntaxError(msg)

  return CurrentTimeNode3(fmt[1:-1], var_name)

现在 do_current_time() 把格式字符串和变量名传递给 CurrentTimeNode3 。

Python 相关文章推荐
python 自动提交和抓取网页
Jul 13 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
Python 打印中文字符的三种方法
Aug 14 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
kali中python版本的切换方法
Jul 11 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
Django与pyecharts结合的实例代码
May 13 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
QT5 Designer 打不开的问题及解决方法
Aug 20 Python
Django限制API访问频率常用方法解析
Oct 12 Python
在Django中编写模版节点及注册标签的方法
Jul 20 #Python
在Python的Django框架中编写编译函数
Jul 20 #Python
Python的Django框架中自定义模版标签的示例
Jul 20 #Python
详解在Python的Django框架中创建模板库的方法
Jul 20 #Python
简单介绍Python的Django框架加载模版的方式
Jul 20 #Python
在Django框架中编写Context处理器的方法
Jul 20 #Python
详解Django框架中用context来解析模板的方法
Jul 20 #Python
You might like
基于pear auth实现登录验证
2010/02/26 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
accesskey 提交
2006/06/26 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python实现定时任务
2017/02/08 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
python怎么判断模块安装完成
2020/06/19 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
销售业务员岗位职责
2014/01/29 职场文书
意向协议书范本
2014/04/23 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
学校德育工作总结2015
2015/05/11 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL