在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中的一些高级编程技巧
Apr 02 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
Dec 21 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
Python使用pandas对数据进行差分运算的方法
Dec 22 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
Python多线程多进程实例对比解析
Mar 12 Python
python动态规划算法实例详解
Nov 22 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 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
python发送arp欺骗攻击代码分析
2014/01/16 Python
浅谈python中set使用
2016/06/30 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
JAVA中运算符的分类及举例
2015/09/12 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
2015年见习期工作总结
2014/12/12 职场文书
安全责任书
2015/01/29 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
2015年工商所工作总结
2015/05/21 职场文书
CSS基础详解
2021/10/16 HTML / CSS