在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实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
在Python的web框架中配置app的教程
Apr 30 Python
简单介绍Python的Django框架的dj-scaffold项目
May 30 Python
对python的文件内注释 help注释方法
May 23 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
Python3.4解释器用法简单示例
Mar 22 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
Flask中endpoint的理解(小结)
Dec 11 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
在Pycharm中安装Pandas库方法(简单易懂)
Feb 20 Python
pytorch实现手写数字图片识别
May 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python采集博客中上传的QQ截图文件
2014/07/18 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
python批量创建指定名称的文件夹
2019/03/21 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
python实现滑雪者小游戏
2020/02/22 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
计算机专业学生求职信分享
2013/12/15 职场文书
老龄工作先进事迹
2014/08/15 职场文书
建党伟业的观后感
2015/06/01 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB