在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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
分享一个常用的Python模拟登陆类
Mar 29 Python
基于python OpenCV实现动态人脸检测
May 25 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
python opencv摄像头的简单应用
Jun 06 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
python不使用for计算两组、多个矩形两两间的iou方式
Jan 18 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
Python return语句如何实现结果返回调用
Oct 15 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
用60行代码实现Python自动抢微信红包
Feb 04 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
2019十大人气国漫
2020/03/13 国漫
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
pandas Dataframe行列读取的实例
2018/06/08 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
python监控nginx端口和进程状态
2019/09/06 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
优秀学生事迹材料
2014/02/08 职场文书
个人自我鉴定总结
2014/03/25 职场文书
大学生作弊检讨书
2014/09/11 职场文书
高中家长意见怎么写
2015/06/03 职场文书
python基础之文件处理知识总结
2021/05/23 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server