在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学习笔记之常用函数及说明
May 23 Python
将Python中的数据存储到系统本地的简单方法
Apr 11 Python
Python中实现参数类型检查的简单方法
Apr 21 Python
python实现图片变亮或者变暗的方法
Jun 01 Python
Python中list初始化方法示例
Sep 18 Python
Python类属性的延迟计算
Oct 22 Python
python 处理dataframe中的时间字段方法
Apr 10 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
Python3开发环境搭建详细教程
Jun 18 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
vue编写简单的购物车功能
2021/01/08 Vue.js
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
python 多线程重启方法
2019/02/18 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
python实现AES加密与解密
2019/03/28 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
如何基于python测量代码运行时间
2019/12/25 Python
Python如何定义有可选参数的元类
2020/07/31 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
财务担保书范文
2014/04/02 职场文书
班主任寄语大全
2014/04/04 职场文书
学习型班组申报材料
2014/05/31 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android