在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中使用gzip模块压缩文件的简单教程
Apr 08 Python
Python3 模块、包调用&amp;路径详解
Oct 25 Python
python机器学习之神经网络(二)
Dec 20 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
python2.7实现邮件发送功能
Dec 12 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
python中的print()输出
Apr 12 Python
Python生成一个迭代器的实操方法
Jun 18 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
python画环形图的方法
Mar 25 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 21 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
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
document.write的几点使用心得
2014/05/14 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
2015/11/17 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
环境工程毕业生自荐信
2013/11/17 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
2014年人事科工作总结
2014/11/19 职场文书
交警失职检讨书
2015/01/26 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
社区活动总结范文
2015/05/07 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书
特种设备安全管理制度
2015/08/06 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang