在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使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
django_orm查询性能优化方法
Aug 20 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
Python数据库小程序源代码
Sep 15 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
Django分组聚合查询实例分享
Apr 29 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
python 安装移动复制第三方库操作
Jul 13 Python
Python并发编程实例教程之线程的玩法
Jun 20 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将文本文件转换csv输出的方法
2014/12/31 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
JS查看对象功能代码
2008/04/25 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
python列表与元组详解实例
2013/11/01 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
Python验证码截取识别代码实例
2020/05/16 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
函授毕业自我鉴定
2013/12/19 职场文书
实习生自我评价
2014/01/18 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
结婚喜宴主持词
2014/03/14 职场文书
委托协议书范本
2014/04/22 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
浅谈pytorch中的dropout的概率p
2021/05/27 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python