Доступ к глобальной переменной в представлении с помощью контекстного процессора в Django - PullRequest
5 голосов
/ 15 октября 2011

Предполагается, что у меня есть контекстный процессор:

def title(request):
   return {'titles': 'mytitle'}

Я могу получить доступ к этой переменной в шаблоне как {{ titles }}.

Но как я могу сделать это в представлении?

def myview(request):
    print request.titles

не похоже на работу - 'WSGIRequest' object has no attribute 'titles'


Или, может быть, есть лучший подход (чем контекстные процессоры), чтобы глобальные переменные были доступны как в представлениях, так и в шаблонах?

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 09 июля 2012

Добавьте путь метода контекста (folder.context_processor.application_context) в TEMPLATE_CONTEXT_PROCESSORS.

в моем случае application_context - это метод, который я определил в файле context_processor.py и метод application_context возвращает {'title': 'mytitle'}

если вы хотите использовать "title" как глобальную переменную в представлениях, используйте его таким образом

global_var = RequestContext(request).get("app_config")
titles = global_var.get("titles")
print titles 

Единственным преимуществом является то, что "одинаковые переменные" заголовки "будут видны как для шаблонов, так и для ваших просмотров"

2 голосов
/ 15 октября 2011

Контекстные процессоры никоим образом не являются глобальными переменными. Это просто функции, которые запускаются при инициировании RequestContext, которые добавляют элементы в этот контекст. Таким образом, они доступны только там, где у вас есть RequestContext, то есть в шаблоне.

Ваши примеры не дают хорошего представления о том, к каким переменным вы хотите обратиться. Если вы просто хотите использовать некоторые константы везде, хороший способ - определить их где-то центрально, скажем в settings.py, и импортировать этот модуль, где вам это нужно, плюс использовать процессор контекста, чтобы добавить их в контекст.

1 голос
/ 07 мая 2016

Если вам нужны данные в ваших представлениях, лучше использовать Middleware в сочетании с контекстным процессором:

  1. Создайте простое пользовательское промежуточное ПО для хранения некоторых данных в объекте запроса, скажем, по адресу request.x ( пример ). Теперь вы можете получить к нему доступ напрямую.
  2. Включите django.core.context_processors.request в вашем TEMPLATE_CONTEXT_PROCESSORS, чтобы request.x был доступен из ваших шаблонов.

См. Мой связанный вопрос: Django: Как обеспечить контекст для всех представлений (не шаблонов)?

...