哦,上下文变量
為什么80%的碼農都做不了架構師?>>> ??
最近項目中遇到一個問題:
有一個base.html,前臺頁面基本都會extends這個base.html
base.html頁面內有兩個變量,需要views傳入。要是有個幾百個繼承base.html的頁面,每個頁面需要一個views,那得是都大的工作量。
上下文變量不錯:
RequestContext?
class RequestContext(Context):
? ? """
? ? This subclass of template.Context automatically populates itself using
? ? the processors defined in TEMPLATE_CONTEXT_PROCESSORS.
? ? Additional processors can be specified as a list of callables
? ? using the "processors" keyword argument.
? ? """
? ? def __init__(self, request, dict_=None, processors=None, current_app=None,
? ? ? ? ? ? use_l10n=None, use_tz=None):
? ? ? ? Context.__init__(self, dict_, current_app=current_app,
? ? ? ? ? ? ? ? use_l10n=use_l10n, use_tz=use_tz)
? ? ? ? if processors is None:
? ? ? ? ? ? processors = ()
? ? ? ? else:
? ? ? ? ? ? processors = tuple(processors)
? ? ? ? for processor in get_standard_processors() + processors:
? ? ? ? ? ? self.update(processor(request))
RequestContext繼承了Context,擴展了Context,最主要的就是紅色的那兩句,
get_standard_processors()?
通過查看方法可以知道是獲取在settings文件中?每個要被執行的處理器函數
TEMPLATE_CONTEXT_PROCESSORS = (
? ? "django.contrib.auth.context_processors.auth",
? ? "django.core.context_processors.debug",
? ? "django.core.context_processors.request",
? ? "django.core.context_processors.media",
)
一個請求進來時的過程 ?url 找到 對應的views, return (上下文變量就是在返回時對request做了一些事,主要就是返回一個字典,類似于return {
? ? ? ? 'user': user,
? ? ? ? 'perms': PermWrapper(user),
? ? }
然后我們在模板就是可以使用返回來的值了),
方法一:只要我們在settings中TEMPLATE_CONTEXT_PROCESSORS定義了一個處理器,那我們使用RequestContext就不需要重復定義每個頁面都需要的變量了。缺點就是每個views都使用了定義的處理器,如果不想讓每個views都被處理那?
方法二:如果不是很多頁面公用變量,而只有一部分,只針對指定的views使用指定的處理器
return ?render_to_response(template_name,extra_context,context_instance=RequestContext(request,processors=[xxxxx]))
原理就是for processor in get_standard_processors() + processors:
? ? ? ? ? ??self.update(processor(request))
在獲取了一開始初始settings設置的processor,同時也加入了我們自定義的一個處理器,這樣我們針對想要使用處理器的views單獨指定。
轉載于:https://my.oschina.net/012345678/blog/170351
總結
- 上一篇: Java序列化(Serializatio
- 下一篇: iOS 7 二维码的生成