Контекстные процессоры 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 }} во всех моих шаблонах

Вернуться на верх