【问题标题】:Why is this Django template context processor not applied for all requests?为什么这个 Django 模板上下文处理器不适用于所有请求?
【发布时间】:2011-07-11 16:26:44
【问题描述】:

我遇到了以下 Django 模板上下文处理器问题。

上下文处理器在myapp/context_processors.py中定义:

def my_context_processor(request):
    return {
        'foo': 123,
    }

它与标准 Django 上下文处理器一起在 settings.py 中连接:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'myproject.myapp.context_processors.my_context_processor',
)

我遇到的问题是 my_context_processor 不适用于所有请求。

不适用于以下代码

def index(request):
    return render_to_response("index.html", locals())

但是,它适用于以下代码:

def index(request):
    return render_to_response("index.html", locals(), context_instance=RequestContext(request))

我的印象是上下文处理器适用于所有请求,而不仅仅是在提供context_instance 时。

如何使我的上下文处理器适用于所有请求?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    您已经回答了自己的问题。它适用于使用RequestContext 的响应。它不适用于那些不适用的人。

    将其应用于所有响应的方法是确保始终使用 RequestContext。或者,在 Django 1.3+ 中,您可以使用新的 render 快捷方式而不是 render_to_response,它会为您创建一个 RequestContext。

    【讨论】:

      【解决方案2】:

      Django 在 Django 1.3 中引入了一个新的render 快捷方式,它自动包含了RequestContext

      from django.shortcuts import render
      
      def my_view(request):
          # View code here...
          context = {
              'some_extra_var_for_template': 'value'
          }
          return render(request, 'myapp/index.html', context)
      

      您可以在Django docs 中了解它。

      【讨论】:

        【解决方案3】:

        上下文处理器变量仅在将RequestContext 对象(使用当前请求初始化)作为context_instance 发送到模板时可用。

        【讨论】:

        • 我可以使用任何 DRY 快捷方式来避免 context_instance 样板吗?我假设一个非常常见的场景是您希望所有请求都存在上下文处理器变量。假设所有视图都包含需要列表“linked_sites”的页脚。 “linked_sites”将由上下文处理器提供,但我想避免在我的代码中添加 context_instance=RequestContext(request) :-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 2021-06-27
        • 2018-10-30
        • 2010-10-24
        • 2015-11-01
        • 2015-11-27
        • 2018-06-19
        相关资源
        最近更新 更多