在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使用BeautifulSoup分析网页信息的方法
Apr 04 Python
Python中逗号的三种作用实例分析
Jun 08 Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
python负载均衡的简单实现方法
Feb 04 Python
解决Python网页爬虫之中文乱码问题
May 11 Python
python实现逆序输出一个数字的示例讲解
Jun 25 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
通过Python扫描代码关键字并进行预警的实现方法
May 24 Python
Django实现drf搜索过滤和排序过滤
Jun 21 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
Protoss兵种介绍
2020/03/14 星际争霸
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
python中的__slots__使用示例
2015/02/26 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
南威尔士家居商店:Leekes
2016/10/25 全球购物
如何写你的创业计划书
2014/01/07 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
个人工作年终总结
2015/03/09 职场文书
投资合作意向书范本
2015/05/08 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
欧元符号 €
2022/02/17 杂记
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js