当前位置: 首页 > 编程笔记 >

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

钱照
2023-03-14
本文向大家介绍在Django的上下文中设置变量的方法,包括了在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 。

 类似资料:
  • 问题内容: 我正在尝试读取Django设置中的一些环境变量,我在/home/user/.bashrc中定义了该变量(后来在/etc/bash.bashrc中定义了),但是我得到的只是一个KeyError异常。我知道我的环境变量已设置,因为我可以在终端(回显$ VAR_NAME)中打印它们。这应该是微不足道的。 这是我正在使用的代码。 我只是找不到什么。有什么建议吗? 谢谢 编辑:使用mod_wsg

  • 问题内容: 这个问题一定很明显,但我不知道。 在模板中,我链接到媒体目录中的js文件。从该文件中,我想访问一个{{my_chart}}之类的上下文变量。 问题答案: 我认为这样不可能。如果要访问视图提供的某些数据,则必须将其传递给js函数。 例 js文件: 视图 希望这可以帮助 :)

  • 问题内容: 这是我第一次使用SQLServer 2012,并且我收到的这段代码不起作用: 这段代码有问题: 我有以下三个错误: 问题答案: 您需要替换为,它将起作用 所以这 需要替换为

  • 问题内容: 我不熟悉Thymeleaf,并将Web页面从JSP转换为Thymeleaf。我有一个像这样的strut标签: 该变量可以在JSP中的任何地方使用。Thymeleaf中是否有其他替代方法? 问题答案: 你可以使用局部变量。 声明带有属性的HTML元素。例如 文档说明 当被处理时,该变量被创建为一个局部变量,并添加到变量地图从上下文来,所以它是可用于评估任何其他变量从一开始就在上下文中声明

  • #include <stdio.h> int func(void) { int i = 2; return i; } int main(void) { int a = 0; a = func(); printf("%d\n", a); return 0; } 技巧 在gdb中,可以用“set var variable=expr”命令设置变量

  • 本文向大家介绍Python中设置变量访问权限的方法,包括了Python中设置变量访问权限的方法的使用技巧和注意事项,需要的朋友参考一下 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性: 如果要让内部属性不被外部访问,可以把属性

  • 问题内容: 用作所有其他页面的基本模板。有导航栏,在导航栏中,我想显示用户收到的消息数。因此,我需要有一个变量一样的。 但是,应如何将此变量传递给它?每个模板都会扩展并由一个函数呈现。我认为返回所有函数不是一个好方法。有更好的方法来实现这一点吗?如何将此变量传递给所有模板? 问题答案: 看看: https //docs.djangoproject.com/en/dev/ref/templates/

  • 在presto的上下文中,我认为我所能做的就是运行SQL。有经验的人吗?