上下文处理器和模型对象。 Django的

时间:2013-10-05 09:46:54

标签: django

问题很简单。

在我的每个视图中,我都需要以下代码:

def my_view(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    # Some code...
    return render(request, 'polls/detail.html', {
            'poll': p
            # The rest of the dict...
        })

所以我认为使用context processors是适当的情况。

但我不明白如何将poll_id参数提供给我的上下文处理器函数。

非常感谢每一个建议。

3 个答案:

答案 0 :(得分:2)

您最好使用TEMPLATE_CONTEXT_PROCESSORS

示例TEMPLATE_CONTEXT_PROCESSORS

使用以下代码向您的任何应用添加一个文件custom_processors.py

def my_view(request):
    p = Poll.objects.filter(pk=1)
    # Some code...
    return {'poll':p[0] if p else '',}

将其添加到settings.py TEMPLATE_CONTEXT_PROCESSORS,例如:

TEMPLATE_CONTEXT_PROCESSORS=(
    ...
    '<appname>.custom_processors.my_view',
)

如果TEMPLATE_CONTEXT_PROCESSORS中没有任何settings.py变量,则导入并附加它:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS += ('<appname>.custom_processors.my_view',)

现在,您可以在任何模板中使用{{poll}}

答案 1 :(得分:2)

这实际上并不适合使用上下文处理器。您可能会发现通用视图更适合。

答案 2 :(得分:1)

由于上下文处理器是“全局”运行的(你不直接调用它们,但是在处理完视图后它们会自动运行),我认为没有一种简单的方法可以做你想要的。< / p>

为什么不在视图中使用辅助函数?

的内容
def get_poll(context, poll_pk):
    context['poll'] = Poll.objects.get(pk=poll_pk)

然后在你看来:

def my_view(request):
    conext = {}
    # Some code...
    get_poll(context, your_poll_id)
    return render(...)

或者,根据您的网址格式,您可能会解析上下文处理器中的request.path属性以找出您想要的ID,但这似乎是hackish,如果您更改了网址设计,它将会中断。