Контекстные процессоры Django: можно ли получить доступ к текущему контексту в ContextProcessor?

есть ли способ получить доступ к текущему контексту, передаваемому view в пользовательском контекстном процессоре, чтобы я мог добавить отсутствующую переменную, если я хочу, а не переопределять существующую переменную ?

чего я пытаюсь достичь:

Я создаю свой URL-адрес, как этот / city_slug/, и я хочу проверить, существует ли переменная city уже в контексте, иначе я хочу добавить город в свой контекст (может использоваться последний используемый город, хранящийся в переменной сеанса, иначе по умолчанию для некоторых city и может быть даже установлена переменная сеанса для следующего использования.)

Я думаю, что это очень распространенная проблема, как вы ее решить ?

4 ответов


вы не можете получить доступ к текущему контексту из контекстного процессора, и я думаю, что промежуточное ПО не будет правильным решением для вас. Возможно, имело бы смысл создать свою собственную функцию рендеринга шаблона, которую вы используете в своих представлениях, и вы всегда передаете ей контекст и текущий запрос и помещаете в него функциональность, которую вы хотите, и рендеринг шаблона в конце с обычными функциями рендеринга, которые предоставляет вам django!


вы можете добиться этого, используя TemplateResponse и TemplateResponse промежуточное.


Я не уверен, что пользовательский обработчик контекста шаблона может это сделать. От документация:

контекстный процессор имеет очень простой интерфейс: это просто функция Python, которая принимает один аргумент, объект HttpRequest, и возвращает словарь, который получает добавил в контексте шаблона. Каждый обработчик контекста должен возвращать словарь.

(выделено мной).

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


вы не можете сделать это с контекстными процессорами Django: они имеют доступ только к объекту запроса, а не к существующему контексту шаблона, к которому добавляется их результат.

сохранение города в сеансах звучит хорошо, если это то, что вы хотите. Шаблоны будут отвечать за любые дальнейшие дефолты; если вам нужно что-то необычное, вы можете посмотреть на его упаковку в многоразовом пользовательский шаблон тег.