【问题标题】:Django, template context processorsDjango,模板上下文处理器
【发布时间】:2011-01-15 20:18:25
【问题描述】:

我有一个奇怪的问题,我想使用上下文处理器添加一个全局查询。 这就是following我的做法:

在我的应用程序中创建了一个 processor.py:

from myproject.myapp.models import Foo

def foos(request):
    return {'foos': Foo.objects.all()}

在我的 setting.py 末尾我添加了这个:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)

最后,我的观点是这样的:

def index_view(request):

    return render_to_response('index.html', {}, context_instance=RequestContext(request))

在我的 index.html 模板中:

<select id="select_foo">
{% for foo in foos %}
    <option value="/{{ foo.slug }}">{{ foo.name }}</option>
{% endfor %}
</select>

最后是我的网址:

(r'^$', 'myapp.views.index_view'),

我的 foos 显示没有任何问题,但是我的 media_url 和其他上下文消失了。 可能是什么问题

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    您需要添加 TEMPLATE_CONTEXT_PROCESSORS 的默认值。但是,您可以通过以下方式将上下文处理器附加到默认值,而不是硬编码这些值,这些值将绑定到特定版本的 Django:

    from django.conf import global_settings
    TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
        "myapp.processor.foos",
    )
    

    确保在元组中包含尾随逗号,以便 Python 将其识别为元组。

    【讨论】:

    • 感谢您的提示!它比人们建议的更典型的解决方案(如 TM 的答案)要好得多。必须指定一整套默认值只是为了添加一个总是让我觉得很混乱,当我升级到 django 1.3 时它又回到了我身上,因为我错过了默认的静态上下文处理器,所以事情没有奏效。
    • 这是更好的答案,因为如果默认处理器发生变化,它仍然可以工作。
    • @Greg Glockner 这是一个很好的提示,但我应该在哪里添加该代码? settings.py?
    • 是的,TEMPLATE_CONTEXT_PROCESSORS 通常在 settings.py 中定义;有关详细信息,请参阅 Django 设置文档。
    • 这更方便,但无论何时升级 Django 版本,您都需要检查这些设置。假设你没有丢失你依赖的东西或者你没有添加你不需要的东西,这并不安全或聪明。
    【解决方案2】:

    当您指定时:

    TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)
    

    在您的设置文件中,您将覆盖 Django 的 default context processors。为了扩展列表,您需要在设置中包含默认设置:

    TEMPLATE_CONTEXT_PROCESSORS = (
        "django.core.context_processors.auth",
        "django.core.context_processors.debug",
        "django.core.context_processors.i18n",
        "django.core.context_processors.media",
        "myapp.processor.foos",
    )
    

    注意,上面的设置是 django 1.1 的默认设置(加上你的处理器)。

    【讨论】:

    • 我的 settings.py 中奇怪地没有 TEMPLATE_CONTEXT_PROCESSORS ,使用默认的 Django 1.1.1 和 media_url 之前工作正常。
    • 那是因为如果你不指定它,它会使用djangos设置中指定的默认值。这就是所有 django 设置的工作方式,如果您的 settings.py 中没有,它们将使用默认设置。
    • 感谢现在工作!我收到错误,所以我删除了“django.contrib.messages.context_processors.messages”,我认为这是 django 的开发版本,而不是 1.1.1
    • 是的,没错,它来自开发版。我更新了答案以显示 1.1 版本。
    • 在 Django 1.5.x 中,需要将第一行替换为django.contrib.auth.context_processors.auth
    【解决方案3】:

    这对我来说适用于 Django 1.3

    TEMPLATE_CONTEXT_PROCESSORS = (
        "django.contrib.auth.context_processors.auth",
        "django.core.context_processors.debug",
        "django.core.context_processors.i18n",
        "django.core.context_processors.media",
        "django.core.context_processors.static",
        "django.contrib.messages.context_processors.messages",
        "myapp.processor.foos", )
    

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 2020-04-12
      • 2015-11-27
      • 1970-01-01
      • 2013-03-05
      • 2012-04-06
      • 2018-06-03
      • 2016-07-01
      • 1970-01-01
      相关资源
      最近更新 更多