Процессоры контекста лучше подходят для обработки более динамических данных объекта - они определены как отображение в документации , и во многих постах они модифицируются или передаются представлениям.- не имеет смысла, что шаблон может потерять доступ к глобальной информации, потому что, например, вы забыли использовать специализированный контекстный процессор в представлении.Данные являются глобальными по определению и связывают представление с шаблоном.
Лучшим способом является определение пользовательского тега шаблона.Таким образом:
- шаблоны не полагаются на представления для передачи в них глобальной информации
- это СУХОЙ: приложение, определяющее глобальные настройки, может быть экспортировано во многие проекты,устранение общего кода в проектах
- шаблоны решают, имеют ли они доступ к глобальной информации, а не к функциям представления
В приведенном ниже примере я имею дело с вашей проблемой - загрузка в этом MIN_TIME_TESTпеременная - и проблема, с которой я обычно сталкиваюсь, загружая URL-адреса, которые меняются при изменении среды.
У меня есть 4 среды - 2 разработки и 2 производства:
- Dev: django-web сервер, url: localhost: 8000
- Dev: веб-сервер apache: url: sandbox.com -> преобразуется в 127.0.0.1
- сервер песочницы Prod, URL-адрес: sandbox.domain.com
- Сервер Prod: url: domain.com
Я делаю это для всех своих проектов и сохраняю все URL в файле global_settings.py, чтобы он был доступен из кода.Я определяю пользовательский тег шаблона {% site_url%}, который можно (необязательно) загрузить в любой шаблон
. Я создаю приложение с именем global_settings и проверяю, включен ли он в мой кортик settings.INSTALLED_APPS.
Django компилирует шаблонный текст в узлы с помощью метода render (), который сообщает, как должны отображаться данные - я создал объект, который отображает данные, возвращая значения в моем global_settings.py на основе переданного имени.
Это выглядит так:
from django import template
import global_settings
class GlobalSettingNode(template.Node):
def __init__(self, settingname):
self.settingname = settingname;
def render(self, context):
if hasattr(global_settings, self.settingname):
return getattr(global_settings, self.settingname)
else:
raise template.TemplateSyntaxError('%s tag does not exist' % self.settingname)
Теперь в global_settings.py я регистрирую пару тегов: site_url для моего примера и min_test_time для вашего примера.Таким образом, когда {% min_time_test%} вызывается из шаблона, он вызывает get_min_time_test, который разрешает загрузку со значением = 5.В моем примере {% site_url%} выполнит поиск по имени, чтобы я мог сохранить все 4 URL-адреса, определенные одновременно, и выбрать, какую среду я использую.Для меня это более гибко, чем просто использование встроенных настроек Django. Флаг Debug = True / False.
from django import template
from templatenodes import GlobalSettingNode
register = template.Library()
MIN_TIME_TEST = 5
DEV_DJANGO_SITE_URL = 'http://localhost:8000/'
DEV_APACHE_SITE_URL = 'http://sandbox.com/'
PROD_SANDBOX_URL = 'http://sandbox.domain.com/'
PROD_URL = 'http://domain.com/'
CURRENT_ENVIRONMENT = 'DEV_DJANGO_SITE_URL'
def get_site_url(parser, token):
return GlobalSettingNode(CURRENT_ENVIRONMENT)
def get_min_time_test(parser, token):
return GlobalSettingNode('MIN_TIME_TEST')
register.tag('site_url', get_site_url)
register.tag('min_time_test', get_min_time_test)
Обратите внимание, что для этого django ожидает, что global_settings.py будет расположен в пакете Pythonпод названием templatetags под вашим приложением Django.Мое приложение Django здесь называется global_settings, поэтому моя структура каталогов выглядит следующим образом:
/ имя-проекта / global_settings / templatetags / global_settings.py и т. Д.
Наконец, шаблон выбирает, загружать ли в globalнастройки или нет, что выгодно для производительности.Добавьте эту строку в шаблон, чтобы отобразить все теги, зарегистрированные в global_settings.py:
{% load global_settings %}
Теперь другие проекты, для которых требуется MIN_TIME_TEST или которые доступны в этих средах, могут просто установить это приложение =)