在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 相关文章推荐
推荐11个实用Python库
Jan 23 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
在Pandas中给多层索引降级的方法
Nov 16 Python
Python面向对象编程基础实例分析
Jan 17 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
Python过滤序列元素的方法
Jul 31 Python
Pytorch实验常用代码段汇总
Nov 19 Python
python如何读取.mtx文件
Apr 22 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
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
JS 判断undefined的实现代码
2009/11/26 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
5种Python单例模式的实现方式
2016/01/14 Python
Python之list对应元素求和的方法
2018/06/28 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
StringBuilder和String的区别
2015/05/18 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
金融专业推荐信
2013/11/14 职场文书
店长职务说明书
2014/02/04 职场文书
企业总经理岗位职责
2014/02/13 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
客户答谢会活动方案
2014/08/31 职场文书
2014年药品销售工作总结
2014/12/16 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server