0

问题很简单。

在我的每个观点中,我都需要以下代码:

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参数提供给我的上下文处理器函数。

每一个建议都将不胜感激。

4

3 回答 3

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}}在任何模板中使用。

于 2013-10-05T09:54:46.440 回答
2

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

于 2013-10-05T11:46:00.150 回答
1

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

为什么不在您的视图中使用辅助函数?类似的东西

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(...)

或者,根据您的 url 模式,您可能会解析request.path上下文处理器中的属性以找出您想要的 id,但这似乎很老套,如果您更改 url 设计就会中断。

于 2013-10-05T11:20:27.547 回答