在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创建xml文件示例
Mar 22 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
简单了解OpenCV是个什么东西
Nov 10 Python
python入门前的第一课 python怎样入门
Mar 06 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
python 如何调用 dubbo 接口
Sep 24 Python
Python修改DBF文件指定列
Dec 19 Python
Python Socket编程详解
Apr 25 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,不用COM,生成excel文件
2006/10/09 PHP
基于mysql的论坛(1)
2006/10/09 PHP
中英文字符串翻转函数
2008/12/09 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
js计算精度问题小结
2013/04/22 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
Python中的默认参数详解
2015/06/24 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
简单了解Python生成器是什么
2019/07/02 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
Python字典实现伪切片功能
2020/10/28 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
科室工作的个人自我评价
2013/10/30 职场文书
电视节目策划方案
2014/05/16 职场文书
2015年组织部工作总结
2015/04/03 职场文书
2015年党风建设工作总结
2015/04/29 职场文书