在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的Cookie.py模块支持冒号做key的方法
Dec 28 Python
Pyramid添加Middleware的方法实例
Nov 27 Python
让python同时兼容python2和python3的8个技巧分享
Jul 11 Python
基于Python的身份证号码自动生成程序
Aug 15 Python
Python实现的简单计算器功能详解
Aug 25 Python
基于pycharm导入模块显示不存在的解决方法
Oct 13 Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 Python
Django中的静态文件管理过程解析
Aug 01 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
Pycharm连接gitlab实现过程图解
Sep 01 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 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
php简单封装了一些常用JS操作
2007/02/25 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
js操作二级联动实现代码
2010/07/27 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python Django批量导入不重复数据
2016/03/25 Python
ipython和python区别详解
2019/06/26 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
python装饰器的特性原理详解
2019/12/25 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
机电专业体育教师求职信
2013/09/21 职场文书
大学军训通讯稿
2014/01/13 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书