在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装饰器使用示例及实际应用例子
Mar 06 Python
Python工程师面试题 与Python基础语法相关
Jan 14 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
详解Django-auth-ldap 配置方法
Dec 10 Python
python url 参数修改方法
Dec 26 Python
python抓取需要扫微信登陆页面
Apr 29 Python
selenium+python环境配置教程详解
May 28 Python
使用python写一个自动浏览文章的脚本实例
Dec 05 Python
Django执行源生mysql语句实现过程解析
Nov 12 Python
Python结合百度语音识别实现实时翻译软件的实现
Jan 18 Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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操作文件方法问答
2007/03/16 PHP
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
机械设计制造专业个人求职信
2013/09/25 职场文书
幼儿园五一活动方案
2014/02/07 职场文书
金融管理专业毕业生求职信
2014/03/12 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
求职信范文怎么写
2015/03/19 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
护士业务学习心得体会
2016/01/25 职场文书
win10下go mod配置方式
2021/04/25 Golang
vue实现简单数据双向绑定
2021/04/28 Vue.js