Django, шаблонные контекстные процессоры
У меня есть странная проблема, я хочу добавить глобальный запрос с использованием контекстных процессоров.
Так я сделал это с помощью следующих:
сделал свой процессор .py в моем приложении как таковом:
from myproject.myapp.models import Foo
def foos(request):
return {'foos': Foo.objects.all()}
и в конце моей настройки .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>
И, наконец, мой url:
(r'^$', 'myapp.views.index_view'),
Мой foos дисплей без каких-либо проблем, однако мои media_url и другие контексты исчезли.
Что может быть проблемой
Ответы
Ответ 1
Когда вы укажете это:
TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)
В вашем файле настроек вы переопределяете 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",
)
Примечание. Приведенные выше настройки являются значениями по умолчанию (плюс ваш процессор) для django 1.1.
Ответ 2
Вам нужно добавить значения по умолчанию TEMPLATE_CONTEXT_PROCESSORS. Однако вместо жесткого кодирования этих значений, которые будут привязаны к определенной версии Django, вы можете добавить свой процессор контекста к значениям по умолчанию следующим образом:
from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
"myapp.processor.foos",
)
Не забудьте включить конечную запятую в кортеж, чтобы Python распознал его как кортеж.
Ответ 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", )