django:在视图开始工作之前获取基本变量

时间:2012-11-08 13:01:50

标签: django view decorator

我有这样一个问题,我已经搜索了很多内容,请阅读decoratorsmiddleware,但我没有抓住如何更好地解决我的问题。

我有基本模板base.html和模板template1.htmltemplate2.html,其扩展为base.html

base.html有一些常规块,template1.htmltemplate2.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}并在任何视图获取自己的数据之前将其呈现给模板?

您能为我提供一个代码示例,或者给我一个如何做得更好的良好链接吗?

2 个答案:

答案 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所说的那样编写自己的上下文处理器。事实上,如果您想将此数据添加到所有您的观点,我建议您这样做。

无论你最终做什么,我都会敦促你研究基于阶级的观点。他们很容易完成许多重复的任务。

进一步阅读: