Django,模板上下文处理器

Hel*_*nar 61 python django django-templates

我有一个奇怪的问题,我想使用上下文处理器添加一个全局查询.这就是我通过以下方式做到的:

在我的应用程序中制作了processor.py:

from myproject.myapp.models import Foo

def foos(request):
    return {'foos': Foo.objects.all()}
Run Code Online (Sandbox Code Playgroud)

在我的setting.py结束时我添加了这个:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)
Run Code Online (Sandbox Code Playgroud)

最后我传递了我的观点:

def index_view(request):

    return render_to_response('index.html', {}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

在我的index.html模板:

<select id="select_foo">
{% for foo in foos %}
    <option value="/{{ foo.slug }}">{{ foo.name }}</option>
{% endfor %}
</select>
Run Code Online (Sandbox Code Playgroud)

最后我的网址:

(r'^$', 'myapp.views.index_view'),
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ner 178

您需要添加TEMPLATE_CONTEXT_PROCESSORS的默认值.但是,您可以通过以下方式将上下文处理器附加到默认值,而不是硬编码那些与特定版本的Django相关联的值.

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    "myapp.processor.foos",
)
Run Code Online (Sandbox Code Playgroud)

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

  • 这是更好的答案,因为如果默认处理器发生变化,它仍然可以工作. (8认同)
  • 这样更方便,但无论何时升级Django版本,都需要检查这些设置.假设你没有丢失你所依赖的东西,或者你没有添加你不需要的东西,这并不是真的安全或聪明. (3认同)
  • 谢谢你的提示!它比人们在TM中提出的更典型的解决方案要好得多.必须指定整套默认值只是为了添加一个默认值我总是把我当作一个kludge,当我升级到django 1.3并且由于我缺少默认的静态上下文处理器而无法正常工作时它确实回到了我身上. (2认同)
  • @Greg Glockner这是一个很好的提示,但我应该在哪里添加该代码?`settings.py`? (2认同)
  • 是的,TEMPLATE_CONTEXT_PROCESSORS通常在settings.py中定义; 有关详细信息,请参阅Django设置文档. (2认同)
  • 注意:由于Django 1.9 global_settings.TEMPLATE_CONTEXT_PROCESSORS是一个列表,而不是一个元组,因此需要将上面的内容更改为`+ ["myapp.processor.foos"]` (2认同)
  • 这个答案可能会针对新版本进行更新。在 django 1.10(也许之前)中,上下文处理器是在“TEMPLATES['OPTIONS']['context_processors']”下设置的,因此没有顶级变量来定义它,并且“global_settings”也不包含它。 (2认同)

TM.*_*TM. 55

当你指定这个:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)
Run Code Online (Sandbox Code Playgroud)

在您的设置文件中,您将覆盖Django的默认上下文处理器.要扩展列表,您需要在设置中包含默认列表:

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",
)
Run Code Online (Sandbox Code Playgroud)

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

  • 那是因为如果你没有指定它,它会使用djangos设置中指定的默认值.这就是所有django设置的工作原理,如果你在`settings.py`中没有它,它们会有一个默认设置. (5认同)

Dav*_*han 6

这对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", )
Run Code Online (Sandbox Code Playgroud)