Контекстные процессоры Django: возможно ли получить доступ к текущему контексту в ContextProcessor?
Есть ли способ, которым я могу получить доступ к текущему контексту, передаваемому представлением в процессоре пользовательского контекста, чтобы я мог добавить отсутствующую переменную, если я хочу, а не переопределять существующую переменную?
Что я пытаюсь достичь:
Я создаю свои URL-адреса следующим образом /city_slug/ и хочу проверить, существует ли переменная города в контексте, в противном случае я хочу добавить город в свой контекст (возможно, используется последний использованный город, сохраненный в переменной сеанса, в противном случае по умолчанию используется какой-либо город, быть даже установленной переменной сеанса для следующего использования.)
Я думаю, что это очень распространенная проблема. Как вы, ребята, решаете ее?
4 ответа
Вы не можете получить доступ к текущему контексту из контекстного процессора, и я думаю, что промежуточное программное обеспечение не будет правильным решением для вас. Возможно, имеет смысл создать свою собственную функцию рендеринга шаблона, которую вы используете в своих представлениях, и вы всегда передаете ей контекст и текущий запрос, помещаете в него нужные вам функции и отрисовываете шаблон в конце с обычными функциями рендеринга django. предоставляет вам!
Вы можете достичь этого, используя TemplateResponse и TemplateResponse middleware.
Я не уверен, может ли пользовательский процессор контекста шаблона сделать это. Из документации:
У контекстного процессора очень простой интерфейс: это просто функция Python, которая принимает один аргумент, объект HttpRequest и возвращает словарь, который добавляется в контекст шаблона. Каждый контекстный процессор должен возвращать словарь.
(Акцент мой).
Вместо этого вам следует взглянуть на написание собственного промежуточного программного обеспечения. Если кто-нибудь знает способ заставить контекстный процессор сделать это, я бы хотел знать.
Вы не можете сделать это с обработчиками контекста Django: они имеют доступ только к объекту запроса, но не к существующему контексту шаблона, к которому добавляется их результат.
Хранение города на сессиях звучит нормально, если вы этого хотите. Шаблоны будут нести ответственность за любые дальнейшие дефолты; если вам нужно что-то необычное, вы можете посмотреть, как его оборачивать в повторно используемый тег шаблона.