У меня есть некоторые вещи в settings.py, к которым я хотел бы получить доступ из шаблона, но я не могу понять, как это сделать. Я уже пробовала
{{CONSTANT_NAME}}
но это не похоже на работу. Это возможно?
django
django-templates
django-settings
Пол Уикс
источник
источник
Ответы:
Django предоставляет доступ к некоторым часто используемым константам настроек шаблона, таким как
settings.MEDIA_URL
и некоторые языковые настройки, если вы используете встроенные общие представления django или передаете аргумент ключевого слова экземпляра контекста вrender_to_response
функции ярлыка. Вот пример каждого случая:Оба этих представления будут иметь несколько часто используемых настроек, например,
settings.MEDIA_URL
доступных для шаблона{{ MEDIA_URL }}
, и т. Д.Если вы ищете доступ к другим константам в настройках, просто распакуйте нужные константы и добавьте их в контекстный словарь, который вы используете в своей функции представления, например так:
Теперь вы можете получить доступ
settings.FAVORITE_COLOR
к вашему шаблону как{{ favorite_color }}
.источник
django-settings-export
чтобы избежать необходимости писать этот код в каждом представлении.Если это значение, которое вы хотели бы иметь для каждого запроса и шаблона, лучше использовать контекстный процессор .
Вот как:
Создайте
context_processors.py
файл в каталоге вашего приложения. Допустим, я хочу иметьADMIN_PREFIX_VALUE
значение в каждом контексте:добавьте ваш контекстный процессор в ваш файл settings.py :
Используйте
RequestContext
в вашем представлении, чтобы добавить ваши контекстные процессоры в ваш шаблон.render
Ярлык делает это автоматически:и, наконец, в вашем шаблоне:
источник
context_process.py
рядом с моимsettings.py
файлом и добавил"context_processors.admin_media"
в свойTEMPLATE_CONTEXT_PROCESSORS
список. Кроме того, вы можете добавить примечание в своем ответе о том факте, что значение по умолчанию TEMPLATE_CONTEXT_PROCESSORS не является пустым, поэтому, если какой-либо из существующих кодов использует любое из значений, установленных этими процессорами контекста по умолчанию, они не будут работать, если вы не добавите их обратно. в список явно.render
ярлык, чтобы избежать необходимости явно включать RequestContext: docs.djangoproject.com/en/1.6/topics/http/shortcuts/#renderЯ считаю, что самым простым подходом является использование одного пользовательского тега шаблона :
Применение:
источник
{% settings_value "DATABASES" %}
:? Этот вариант использования должен прояснить, почему настройки не доступны в шаблонах для начала.templatetags
папку внутри вашего приложения с пустым__init__.py
файлом и этим кодом, какsettings.py
внутри этой папки. 2) в свой шаблон вы добавляете{% load settings %}
и затем используете свой новый тег!Проверьте
django-settings-export
(отказ от ответственности: я автор этого проекта).Например...
settings.py
template.html
источник
render
а неrender_to_response
Еще один способ сделать это - создать пользовательский тег шаблона, который позволит вам вывести значения из настроек.
Затем вы можете использовать:
распечатать его на любой странице, не перепрыгивая через контекстные процессоры.
источник
Мне нравится решение Берислава, потому что на простых сайтах оно чисто и эффективно. Что мне НЕ нравится, так это выставление всех констант настроек волей-неволей. Итак, что я в итоге сделал это:
Применение:
Это защищает любые константы, которые вы не назвали, от использования в шаблоне, и, если вы хотите получить действительно модный, вы можете установить кортеж в настройках и создать более одного тега шаблона для разных страниц, приложений или областей, и просто при необходимости объедините локальный кортеж с кортежем настроек, затем выполните понимание списка, чтобы увидеть, является ли значение приемлемым.
Я согласен, на сложном сайте это немного упрощенно, но есть значения, которые было бы неплохо иметь универсально в шаблонах, и это, кажется, работает хорошо. Спасибо Бериславу за оригинальную идею!
источник
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
этоFalse
, не подстрок проблемы.if
заявлении? Я хочу проверитьDEBUG
значениеЯ немного улучшил ответ chrisdew (чтобы создать свой собственный тег).
Сначала создайте файл,
yourapp/templatetags/value_from_settings.py
в котором вы определите свой новый тегvalue_from_settings
:Вы можете использовать этот тег в своем шаблоне через:
или через
Преимущество
as ...
обозначений состоит в том, что это облегчает использование вblocktrans
блоках с помощью простого{{my_fqdn}}
.источник
Добавление ответа с подробными инструкциями по созданию настраиваемого тега шаблона, решающего эту проблему, с помощью Django 2.0+
В вашей папке приложения создайте папку с именем templatetags . В нем создайте __init__.py и custom_tags.py :
В custom_tags.py создайте функцию пользовательского тега, которая обеспечивает доступ к произвольному ключу в константе настроек :
Чтобы понять этот код, я рекомендую прочитать раздел о простых тегах в документации Django.
Затем вам нужно сообщить Django об этом (и любом дополнительном) пользовательском теге, загрузив этот файл в любой шаблон, где вы будете его использовать. Так же, как вам нужно загрузить встроенный статический тег:
Когда он загружен, его можно использовать так же, как и любой другой тег, просто укажите нужную настройку, которую вам нужно вернуть. Так что если у вас есть переменная BUILD_VERSION в ваших настройках:
Это решение не будет работать с массивами, но, если вам это нужно, вы можете использовать большую логику в своих шаблонах.
Примечание. Более чистым и отказоустойчивым решением, вероятно, было бы создание настраиваемого контекстного процессора, в котором вы добавляете нужные настройки в контекст, доступный для всех шаблонов. Таким образом, вы по ошибке уменьшите риск вывода конфиденциальных настроек в ваши шаблоны.
источник
Добавьте этот код в файл с именем
context_processors.py
:А затем, в вашем файле настроек, включите путь, такой как
'speedy.core.base.context_processors.settings'
(с вашим именем приложения и пути) в'context_processors'
настройках вTEMPLATES
.(Вы можете увидеть, например, settings / base.py и context_processors.py ).
Затем вы можете использовать определенные настройки в любом коде шаблона. Например:
Обновление: приведенный выше код предоставляет все настройки для шаблонов, включая конфиденциальную информацию, такую как ваша
SECRET_KEY
. Хакер может использовать эту функцию для отображения такой информации в шаблонах. Если вы хотите предоставить шаблонам только определенные настройки, используйте этот код:источник
SECRET_KEY
. Хакер может использовать эту функцию для отображения такой информации в шаблонах.Приведенный выше пример из bchhun хорош, за исключением того, что вам нужно явно создать свой контекстный словарь из settings.py. Ниже приведен НЕПРОВЕРЕННЫЙ пример того, как вы можете автоматически построить контекстный словарь из всех прописных атрибутов settings.py (re: "^ [A-Z0-9 _] + $").
В конце settings.py:
источник
Если кто-то найдет этот вопрос, как я, я опубликую свое решение, которое работает на Django 2.0:
Этот тег назначает некоторое значение переменной settings.py переменной шаблона:
Применение:
{% get_settings_value template_var "SETTINGS_VAR" %}
приложение / templatetags / my_custom_tags.py:
Ваш шаблон:
Смотрите документацию Django о том, как создавать собственные теги шаблонов здесь: https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
источник
{% if settings_debug %}
{% if settings_debug == True %}
на предложенное{% if settings_debug %}
Если используется представление на основе классов:
источник
Я обнаружил, что это самый простой подход для Django 1.3:
views.py
hero.html
источник
И IanSR, и bchhun предложили переопределить TEMPLATE_CONTEXT_PROCESSORS в настройках. Имейте в виду, что этот параметр имеет значение по умолчанию, которое может вызвать некоторые неприятные вещи, если вы переопределите его, не переустанавливая значения по умолчанию. Значения по умолчанию также изменились в последних версиях Django.
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
TEMPLATE_CONTEXT_PROCESSORS по умолчанию:
источник
Если бы мы сравнили теги контекста и шаблона на одной переменной, то знание более эффективного варианта могло бы принести пользу. Тем не менее, вам может быть лучше окунуться в настройки только из шаблонов, которые нуждаются в этой переменной. В этом случае нет смысла передавать переменную во все шаблоны. Но если вы отправляете переменную в общий шаблон, такой как шаблон base.html, то это не имеет значения, поскольку шаблон base.html отображается при каждом запросе, поэтому вы можете использовать любой из этих методов.
Если вы решили использовать параметр тегов шаблона, используйте следующий код, поскольку он позволяет передавать значение по умолчанию , на случай, если рассматриваемая переменная не была определена.
Пример: get_from_settings my_variable as my_context_value
Пример: get_from_settings my_variable my_default as my_context_value
источник
SITE_EXTRA_CONTEXT_DICT
в Finalware, чтобы сделать это для вас.