在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之wxPython菜单使用详解
Sep 28 Python
Python中函数参数设置及使用的学习笔记
May 03 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
Python实现元素等待代码实例
Nov 11 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
浅析python中的del用法
Sep 02 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
python操作toml文件的示例代码
Nov 27 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
python数据预处理方式 :数据降维
2020/02/24 Python
Python pandas如何向excel添加数据
2020/05/22 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
学校运动会开幕演讲稿
2014/01/04 职场文书
会计电算化学生个人的自我评价
2014/02/08 职场文书
书香校园活动方案
2014/02/28 职场文书
洗发露广告词
2014/03/14 职场文书
二年级小学生评语
2014/04/21 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
美术专业自荐信
2014/07/07 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
redis实现共同好友的思路详解
2021/05/26 Redis
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
vue使用watch监听属性变化
2022/04/30 Vue.js
Java数据结构之堆(优先队列)
2022/05/20 Java/Android