在Django的上下文中设置变量的方法

前一节的例子只是简单的返回一个值。 很多时候设置一个模板变量而非返回值也很有用。 那样,模板作者就只能使用你的模板标签所设置的变量。

要在上下文中设置变量,在 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 。

(0)

相关推荐

  • Python的Django框架中自定义模版标签的示例

    为了自定义一个模板标签,你需要告诉Django当遇到你的标签时怎样进行这个过程. 当Django编译一个模板时,它将原始模板分成一个个 节点 .每个节点都是 django.template.Node 的一个实例,并且具备 render() 方法. 于是,一个已编译的模板就是 节点 对象的一个列表. 例如,看看这个模板: Hello, {{ person.name }}. {% ifequal name.birthday today %} Happy birthday! {% else %} Be

  • 在Python的Django框架中编写编译函数

    当遇到一个模板标签(template tag)时,模板解析器就会把标签包含的内容,以及模板解析器自己作为参数调用一个python函数. 这个函数负责返回一个和当前模板标签内容相对应的节点(Node)的实例. 例如,写一个显示当前日期的模板标签:{% current_time %}.该标签会根据参数指定的 strftime 格式(参见:http://www.djangoproject.com/r/python/strftime/)显示当前时间.首先确定标签的语法是个好主意. 在这个例子里,标签应该

  • 在Python的Django框架中包装视图函数

    我们最终的视图技巧利用了一个高级python技术. 假设你发现自己在各个不同视图里重复了大量代码,就像 这个例子: def my_view1(request): if not request.user.is_authenticated(): return HttpResponseRedirect('/accounts/login/') # ... return render_to_response('template1.html') def my_view2(request): if not r

  • 在Django的上下文中设置变量的方法

    前一节的例子只是简单的返回一个值. 很多时候设置一个模板变量而非返回值也很有用. 那样,模板作者就只能使用你的模板标签所设置的变量. 要在上下文中设置变量,在 render() 函数的context对象上使用字典赋值. 这里是一个修改过的 CurrentTimeNode ,其中设定了一个模板变量 current_time ,并没有返回它: class CurrentTimeNode2(template.Node): def __init__(self, format_string): self.

  • django框架模板中定义变量(set variable in django template)的方法分析

    本文实例讲述了django框架模板中定义变量的方法.分享给大家供大家参考,具体如下: 总有一些情况,你会想在django template中设置临时变量,但是django 对在模板中对临时变量的赋值没有很好的开箱即用的tag 或者filter.但是还是能通过一些其他方法实现的. 1. 利用 django 自带的 with 标签实现 2. 利用自定义 tag  实现,应该灵活很多. 利用 django 自带的 with 标签实现对变量赋值 好像在django 1.3 之后才支持这种做法 从cont

  • win10设置java环境变量的方法

    1.首先,win10得找到设置的入口:Control Panel\All Control Panel Items\System 2.找到advanced system settings 以上这篇win10设置java环境变量的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • C#设置与获取环境变量的方法详解

    1.前言 本来想拿学校机房的Android编辑器直接粘到自己电脑上用,发现它的eclipse是32位的,而我的JDK是64位的,于是想到干脆装两个JDK,用C#做一个能够更改环境变量的程序 环境变量是包含关于系统及当前登录用户的环境信息的字符串,一些软件程序使用此信息确定在何处放置文件(如临时文件). 环境变量说白了就是指定一个软件的路径,比如说配置TomcatJdk等软件时就必须设置环境变量. 下面话不多说了,来一起看看详细的介绍吧. 2.代码 Environment类下的静态方法 获取环境变

  • 详解Django 时间与时区设置问题

    再写入数据库对时间进行加减操作时候 django报告了错误 TypeError: can't subtract offset-naive and offset-aware datetimes 修改setting.py 文件 在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ 如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即America/Chicago, 此时的TIME_ZONE不管有没有设置都不

  • Kotlin如何捕获上下文中的变量与常量详解

    Lambda表达式或匿名函数可以访问或修改其所在上下文中的变量和常量,这个过程被称为捕获. fun main(args: Array<String>) { //定义一个函数,该函数的返回值类型为()->List<String> fun makeList(ele: String): () -> List<String> { //创建一个不包含任何元素的List var list: MutableList<String> = mutableListO

  • 如何在Django中设置定时任务的方法示例

    Django 作为后端Web开发框架,有时候我们需要用到定时任务来或者固定频次的任务来执行某段代码,这时我们就要用到Celery了.Django中有一个中间件:Django-celery 环境: Python 3.6 Django为小于1.8版本 Celery为3.1版本 第一步安装:django-celery pip install django-celery 第二步:配置celery和任务 创建测试django环境: django-admin.py createproject test dj

  • django 实现celery动态设置周期任务执行时间

    蓝鲸paas平台app开发经验分享 腾讯蓝鲸智云是一套基于PaaS的技术解决方案,提供了完善的前后台开发框架.调度引擎.公共组件等模块,帮助业务的产品和技术人员快速构建低成本.免运维的支撑工具和运营系统. PaaS平台不仅将应用服务的运行和开发环境作为一种服务提供给开发者用户,更为开发者用户提供了高效便捷的开发服务,如:组件系统,统一登录,权限管理,后台框架,MagicBox,桌面/工作台等. PaaS平台提供支持多语言的开发框架,助力运维人员能基于平台之上以自己擅长的技术语言(Python.j

  • linux安装jdk并设置环境变量的方法教程(看这一篇够了)

    1.查看linux位数 查看linux是32位还是64位,影响需要下载JDK的版本 系统位数 jdk位数 x86(32位) 32位 x86_64(64位) 32位 64位 在linux命令输入: uname -a 如果是64位机器,会输出x86_64 2.下载JDK 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 对应步骤1,下载64位的linx版本 3.安装JD

  • Python Django中的STATIC_URL 设置和使用方式

    使用Django静态设置时,遇到很多问题,经过艰苦的Baidu, stack overflow, Django原档阅读,终于把静态图片给搞出来了.特记录下来. 关键的概念:Django中,静态资源的存放通过设置 STATIC_URL, STATICFILES_DIRS 来设置,一般STATIC_URL设置为:/static/ STATIC_URL='/static/', 这个static 是在Django 具体APP下建立的static目录,用来存放静态资源.而STATICFILES_DIRS一

随机推荐