国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

在Django的上下文中設(shè)置變量的方法

2020-01-04 18:01:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了在Django的上下文中設(shè)置變量的方法,Django是重多Python高人氣框架中最為著名的一個(gè),需要的朋友可以參考下

前一節(jié)的例子只是簡(jiǎn)單的返回一個(gè)值。 很多時(shí)候設(shè)置一個(gè)模板變量而非返回值也很有用。 那樣,模板作者就只能使用你的模板標(biāo)簽所設(shè)置的變量。

要在上下文中設(shè)置變量,在 render() 函數(shù)的context對(duì)象上使用字典賦值。 這里是一個(gè)修改過(guò)的 CurrentTimeNode ,其中設(shè)定了一個(gè)模板變量 current_time ,并沒(méi)有返回它:

 

 
  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 '' 

(我們把創(chuàng)建函數(shù)do_current_time2和注冊(cè)給current_time2模板標(biāo)簽的工作留作讀者練習(xí)。)

注意 render() 返回了一個(gè)空字符串。 render() 應(yīng)當(dāng)總是返回一個(gè)字符串,所以如果模板標(biāo)簽只是要設(shè)置變量, render() 就應(yīng)該返回一個(gè)空字符串。

你應(yīng)該這樣使用這個(gè)新版本的標(biāo)簽:

 

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

但是 CurrentTimeNode2 有一個(gè)問(wèn)題: 變量名 current_time 是硬編碼的。 這意味著你必須確定你的模板在其它任何地方都不使用 {{ current_time }} ,因?yàn)?{% current_time2 %} 會(huì)盲目的覆蓋該變量的值。

一種更簡(jiǎn)潔的方案是由模板標(biāo)簽來(lái)指定需要設(shè)定的變量的名稱,就像這樣:

 

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

為此,你需要重構(gòu)編譯函數(shù)和 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) 

現(xiàn)在 do_current_time() 把格式字符串和變量名傳遞給 CurrentTimeNode3 。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湘乡市| 崇明县| 喀什市| 常宁市| 南丹县| 香格里拉县| 阿拉善右旗| 阆中市| 大厂| 云梦县| 齐河县| 鲁甸县| 平顶山市| 开阳县| 台州市| 土默特右旗| 武山县| 屯昌县| 淮北市| 理塘县| 怀来县| 林口县| 太康县| 曲松县| 铜梁县| 安多县| 和硕县| 吐鲁番市| 仙游县| 闽侯县| 昆山市| 康平县| 湄潭县| 黄浦区| 洱源县| 青龙| 台湾省| 延吉市| 宁波市| 汤原县| 宕昌县|