Контекстные процессоры Django доступны глобально для шаблонов во ВСЕХ приложениях
Я новичок в Django/Python, и пытаюсь найти лучший способ иметь глобальные константы в моем проекте, которые доступны для шаблонов во ВСЕХ APPS в проекте. Основные глобальные константы, такие как название компании, номер телефона, url, социальные ссылки и т.д.
После довольно длительного поиска, лучший ответ, который я нашел - это создание пользовательских контекстных процессоров, но, как я понимаю, это потребует от меня создания пользовательского файла content_processors.py в каждом приложении и добавления ссылки на каждый из них в settings.py основного проекта. Это кажется нарушением концепции DRY, и я предполагаю, что упускаю что-то основное.
Вот что у меня есть сейчас. Мой проект называется www и одно из приложений называется home.
В www/settings.py у меня есть строка следующего содержания:
COMPANY_NAME = ‘My Company Name’
Я создал этот файл home/context_processors.py со следующим содержимым:
from django.conf import settings
def www(request):
return {
'company_name': settings.COMPANY_NAME
}
В разделе TEMPLATES/OPTIONS/content_processors моего www/settings.py я добавил:
’home.context_processors.www’
А мой шаблон домашней страницы в /home/templates имеет
{{ company_name }}
Это прекрасно работает, но теперь, когда я создаю другое приложение под названием products, кажется, что мне нужно добавить еще один файл products/context_processors.py с точно таким же содержимым, как home/context_processors.py, и мне нужно добавить еще одну строку в настройках для ’products.context_processors.www’
Конечно, я могу это сделать, но это кажется довольно большим количеством повторений, особенно учитывая, что у меня будет десятки приложений для этого сайта. Я предполагаю, что должен быть способ сделать эти общие строки (и другие настройки) доступными для всех шаблонов во всех приложениях глобально.
Надеюсь, кто-нибудь укажет на простую ошибку в моем понимании :-)
Я смог наконец получить ответ на неофициальном форуме Django Discord, поэтому я решил опубликовать решение здесь на случай, если другие столкнутся с той же проблемой.
Оказывается, что если установить context_processors только в одном приложении, то все, что используется этим приложением, становится доступным глобально. Таким образом, основываясь на моем примере выше:
(1) В проекте settings.py я добавляю в раздел context_processors:
'home.context_processors.site_settings'
(2) Я добавляю в конце settings.py:
COMPANY_NAME = ‘My Company Name’
(3) Учитывая, что мое первое приложение в проекте называется home, я добавляю в каталог этого приложения папку contenxt_processors.py, и добавляю в нее следующее:
from django.conf import settings
def site_settings(request):
return {
'company_name': settings.COMPANY_NAME,
}
(4) Теперь константа доступна мне в всех шаблонах, в всех моих приложениях, без необходимости повторять процесс в других приложениях. Это кажется неинтуитивным, но работает как шарм. Таким образом, в любом шаблоне, который я добавляю {{ company_name }}, будет отображаться название моей компании , как я установил в settings.py файле.
(5) Теперь, если я хочу добавить другие константы, я просто добавляю их в файл settings.py под COMPANY_NAME = ‘My Company Name’. Например, теперь я могу добавить
COMPANY_URL = 'www.mydomain.com'
и затем я также добавляю его в файл context_processors.py в моей основной папке app. Таким образом, теперь это выглядит следующим образом:
from django.conf import settings
def site_settings(request):
return {
'company_name': settings.COMPANY_NAME,
'company_url': settings.COMPANY_URL,
}
Вот и все, и теперь у меня есть {{ company_name }} и {{ company_url }} во всех моих шаблонах