我有这样一个问题,我已经搜索了很多内容,请阅读decorators
和middleware
,但我没有抓住如何更好地解决我的问题。
我有基本模板base.html
和模板template1.html
和template2.html
,其扩展为base.html
。
base.html
有一些常规块,template1.html
和template2.html
需要。
这个块有dinamic数据,所以我必须在每个视图中获取该块的数据,然后渲染模板。
例如我有2 views
:
@render_to("template1.html")
def fun_1(request):
data = getGeneralData()
#...getting other data
return {
"data" : data,
"other" : other_data,
}
@render_to("template2.html")
def fun_2(request):
data = getGeneralData()
#...getting other data
return {
"data" : data,
"other2" : other_data2,
}
所以一般情况下,我需要getGeneralData
views
,我可以在每个视图中调用getGeneralData()
函数,或者我可以创建任何函数{{1}并在任何视图获取自己的数据之前将其呈现给模板?
您能为我提供一个代码示例,或者给我一个如何做得更好的良好链接吗?
答案 0 :(得分:1)
建议您编写自己的context processor并从那里返回所需的上下文数据。
示例:
custom_context_processor.py
def ctx_getGeneralData(request):
ctx = {}
ctx['data'] = getGeneralData()
return ctx
在设置文件中,将TEMPLATE_CONTEXT_PROCESSORS
更新为'custom_context_processor.ctx_getGeneralData'
答案 1 :(得分:1)
您是否考虑过使用Django基于类的视图?它们最初有点难以使用,但它们使这样的事情变得非常简单。以下是我使用基于类的视图重写基于函数的视图的方法:
# TemplateView is a generic class based view that simply
# renders a template.
from django.views.generic import TemplateView
# Let's start by defining a mixin that we can mix into any view that
# needs the result of getGeneralData() in its template context.
class GeneralContextDataMixin(object):
"""
Adds the result of calling getGeneralData() to the context of whichever
view it is mixed into.
"""
get_context_data(self, *args, **kwargs):
"""
Django calls get_context_data() on all CBVs that render templates.
It returns a dictionary containing the data you want to add to
your template context.
"""
context = super(GeneralContextDataMixin, self).get_context_data(*args, **kwargs)
context['data'] = getGeneralData()
return context
# Now we can inherit from this mixin wherever we need the results of
# getGeneralData(). Note the order of inheritance; it's important.
class View1(GeneralContextDataMixin, TemplateView):
template_name = 'template1.html'
class View2(GeneralContextDataMixin, TemplateView):
template_name = 'template2.html'
当然,你也可以像Rohan所说的那样编写自己的上下文处理器。事实上,如果您想将此数据添加到所有您的观点,我建议您这样做。
无论你最终做什么,我都会敦促你研究基于阶级的观点。他们很容易完成许多重复的任务。
进一步阅读: