很多時候設定乙個模板變數而非返回值也很有用。 那樣,模板作者就只能使用模板標籤所設定的變數。
要在上下文中設定變數,在 render() 函式的context物件上使用字典賦值。 這裡是乙個修改過的 currenttimenode ,其中設定了乙個模板變數 current_time ,並沒有返回它:
class
currenttimenode2
(template.node)
:def
__init__
(self, format_string)
: self.format_string =
str(format_string)
defrender
(self, context)
: now = datetime.datetime.now(
) context[
'current_time'
]= now.strftime(self.format_string)
return
''
(我們把建立函式do_current_time2和註冊給current_time2模板標籤的工作留作讀者練習。)
注意 render() 返回了乙個空字串。 render() 應當總是返回乙個字串,所以如果模板標籤只是要設定變數, render() 就應該返回乙個空字串。
你應該這樣使用這個新版本的標籤:
the time is}.
<
/p>
但是 currenttimenode2 有乙個問題: 變數名 current_time 是硬編碼的。 這意味著你必須確定你的模板在其它任何地方都不使用 } ,因為 會盲目的覆蓋該變數的值。
一種更簡潔的方案是由模板標籤來指定需要設定的變數的名稱,就像這樣:
the current time is}.
<
/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
defrender
(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)
ifnot
(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中全域性Context處理器
1.模板標籤和模板變數 模板標籤在中定義 thanks for logging in please log in.模板變數在 中定義 my first name is my last name is 2.context處理器和 requestcontext處理器 context 是乙個傳遞給模板的名...
在Django框架中編寫Context處理器的方法
寫context處理器的一些建議 編寫處理器的一些建議 使每個context處理器完成盡可能小的功能。使用多個處理器是很容易的,所以你可以根據邏輯塊來分解功能以便將來復用。要注意 template context processors 裡的context processor 將會在基於這個setti...
Android 中呼叫全域性Context
經常需要用到系統的一些功能必須傳遞context物件,往往有時候不方便傳遞當前的context或者即使能夠傳遞context也非常麻煩,比如 audiomanager aduiomanager audiomanager context.getsystemservice context.audio s...