在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处理PHP数组文本文件实例
Sep 18 Python
Python发送form-data请求及拼接form-data内容的方法
Mar 05 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
django js实现部分页面刷新的示例代码
May 28 Python
python实现从pdf文件中提取文本,并自动翻译的方法
Nov 28 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
如何使用python操作vmware
Jul 27 Python
python实现ftp文件传输功能
Mar 20 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
python反扒机制的5种解决方法
Feb 06 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
JavaScript函数、方法、对象代码
2008/10/29 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
JavaScript模拟push
2016/03/06 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
解决Mac安装scrapy失败的问题
2018/06/13 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
浅谈flask源码之请求过程
2018/07/26 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
Python的log日志功能及设置方法
2019/07/11 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
大专自我鉴定范文
2013/10/01 职场文书
软件工程专业推荐信
2013/10/28 职场文书
土木工程毕业生推荐信
2013/10/28 职场文书
后勤部长岗位职责
2013/12/14 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
见习报告格式要求
2014/11/04 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
办公室文员岗位职责
2015/02/04 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
mysql函数之截取字符串的实现
2022/08/14 MySQL