首页 > 编程 > Python > 正文

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

2020-01-04 18:01:25
字体:
来源:转载
供稿:网友

这篇文章主要介绍了在Django的上下文中设置变量的方法,Django是重多Python高人气框架中最为著名的一个,需要的朋友可以参考下

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

要在上下文中设置变量,在 render() 函数的context对象上使用字典赋值。 这里是一个修改过的 CurrentTimeNode ,其中设定了一个模板变量 current_time ,并没有返回它:

 

 
  1. class CurrentTimeNode2(template.Node): 
  2. def __init__(self, format_string): 
  3. self.format_string = str(format_string) 
  4.  
  5. def render(self, context): 
  6. now = datetime.datetime.now() 
  7. context['current_time'] = now.strftime(self.format_string) 
  8. return '' 

(我们把创建函数do_current_time2和注册给current_time2模板标签的工作留作读者练习。)

注意 render() 返回了一个空字符串。 render() 应当总是返回一个字符串,所以如果模板标签只是要设置变量, render() 就应该返回一个空字符串。

你应该这样使用这个新版本的标签:

 

 
  1. {% current_time2 "%Y-%M-%d %I:%M %p" %} 
  2. <p>The time is {{ current_time }}.</p> 

但是 CurrentTimeNode2 有一个问题: 变量名 current_time 是硬编码的。 这意味着你必须确定你的模板在其它任何地方都不使用 {{ current_time }} ,因为 {% current_time2 %} 会盲目的覆盖该变量的值。

一种更简洁的方案是由模板标签来指定需要设定的变量的名称,就像这样:

 

 
  1. {% get_current_time "%Y-%M-%d %I:%M %p" as my_current_time %} 
  2. <p>The current time is {{ my_current_time }}.</p> 

为此,你需要重构编译函数和 Node 类,如下所示:

 

 
  1. import re 
  2.  
  3. class CurrentTimeNode3(template.Node): 
  4. def __init__(self, format_string, var_name): 
  5. self.format_string = str(format_string) 
  6. self.var_name = var_name 
  7.  
  8. def render(self, context): 
  9. now = datetime.datetime.now() 
  10. context[self.var_name] = now.strftime(self.format_string) 
  11. return '' 
  12.  
  13. def do_current_time(parser, token): 
  14. # This version uses a regular expression to parse tag contents. 
  15. try
  16. # Splitting by None == splitting by spaces. 
  17. tag_name, arg = token.contents.split(None, 1) 
  18. except ValueError: 
  19. msg = '%r tag requires arguments' % token.contents[0] 
  20. raise template.TemplateSyntaxError(msg) 
  21.  
  22. m = re.search(r'(.*?) as (/w+)', arg) 
  23. if m: 
  24. fmt, var_name = m.groups() 
  25. else
  26. msg = '%r tag had invalid arguments' % tag_name 
  27. raise template.TemplateSyntaxError(msg) 
  28.  
  29. if not (fmt[0] == fmt[-1] and fmt[0] in ('"', "'")): 
  30. msg = "%r tag's argument should be in quotes" % tag_name 
  31. raise template.TemplateSyntaxError(msg) 
  32.  
  33. return CurrentTimeNode3(fmt[1:-1], var_name) 

现在 do_current_time() 把格式字符串和变量名传递给 CurrentTimeNode3 。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表