在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 相关文章推荐
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
Django添加sitemap的方法示例
Aug 06 Python
Django Rest framework之认证的实现代码
Dec 17 Python
详解python实现交叉验证法与留出法
Jul 11 Python
python读取Excel表格文件的方法
Sep 02 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
Python selenium模块实现定位过程解析
Jul 09 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
python数据分析之单因素分析线性拟合及地理编码
Jun 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
自动分页的不完整解决方案
2007/01/12 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
解析PHP 5.5 新特性
2013/07/02 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
jquery ajax abort()的使用方法
2010/10/28 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
python实现简单名片管理系统
2018/11/30 Python
Python多线程获取返回值代码实例
2020/02/17 Python
python自动生成证件号的方法示例
2021/01/14 Python
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
internal修饰符起什么作用
2013/12/16 面试题
学生上课看漫画的检讨书
2014/09/26 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书