Могу ли я получить доступ к константам в settings.py из шаблонов в Django? - PullRequest
337 голосов
/ 11 января 2009

У меня есть некоторые вещи в settings.py, к которым я хотел бы получить доступ из шаблона, но я не могу понять, как это сделать. Я уже попробовал

{{CONSTANT_NAME}}

но это не похоже на работу. Возможно ли это?

Ответы [ 15 ]

4 голосов
/ 28 декабря 2018

Добавьте этот код в файл с именем context_processors.py:

from django.conf import settings as django_settings


def settings(request):
    return {
        'settings': django_settings,
    }

И затем, в вашем файле настроек, укажите путь, например 'speedy.core.base.context_processors.settings' (с вашим именем приложения и путем) в настройках 'context_processors' в TEMPLATES.

(Вы можете увидеть, например, https://github.com/speedy-net/speedy-net/blob/staging/speedy/core/settings/base.py и https://github.com/speedy-net/speedy-net/blob/staging/speedy/core/base/context_processors.py).

4 голосов
/ 29 апреля 2013

Если используется представление на основе классов:

#
# in settings.py
#
YOUR_CUSTOM_SETTING = 'some value'

#
# in views.py
#
from django.conf import settings #for getting settings vars

class YourView(DetailView): #assuming DetailView; whatever though

    # ...

    def get_context_data(self, **kwargs):

        context = super(YourView, self).get_context_data(**kwargs)
        context['YOUR_CUSTOM_SETTING'] = settings.YOUR_CUSTOM_SETTING

        return context

#
# in your_template.html, reference the setting like any other context variable
#
{{ YOUR_CUSTOM_SETTING }}
1 голос
/ 23 августа 2013

Я нашел, что это самый простой подход для Django 1.3:

  1. views.py

    from local_settings import BASE_URL
    
    def root(request):
        return render_to_response('hero.html', {'BASE_URL': BASE_URL})
    
  2. hero.html

    var BASE_URL = '{{ JS_BASE_URL }}';
    
0 голосов
/ 11 декабря 2011

Если бы мы сравнивали контекстные и шаблонные теги для одной переменной, то знание более эффективного варианта могло бы принести пользу. Тем не менее, вам может быть лучше окунуться в настройки только из шаблонов, которые нуждаются в этой переменной. В этом случае нет смысла передавать переменную во все шаблоны. Но если вы отправляете переменную в общий шаблон, такой как шаблон base.html, то это не имеет значения, поскольку шаблон base.html отображается при каждом запросе, поэтому вы можете использовать любой из методов.

Если вы решите использовать параметр тегов шаблона, используйте следующий код, поскольку он позволяет передавать значение по умолчанию в случае, если рассматриваемая переменная не определена.

Пример: get_from_settings my_variable as my_context_value

Пример: get_from_settings my_variable my_default as my_context_value

class SettingsAttrNode(Node):
    def __init__(self, variable, default, as_value):
        self.variable = getattr(settings, variable, default)
        self.cxtname = as_value

    def render(self, context):
        context[self.cxtname] = self.variable
        return ''


def get_from_setting(parser, token):
    as_value = variable = default = ''
    bits = token.contents.split()
    if len(bits) == 4 and bits[2] == 'as':
        variable = bits[1]
        as_value = bits[3]
    elif len(bits) == 5 and bits[3] == 'as':
        variable     = bits[1]
        default  = bits[2]
        as_value = bits[4]
    else:
        raise TemplateSyntaxError, "usage: get_from_settings variable default as value " \
                "OR: get_from_settings variable as value"

    return SettingsAttrNode(variable=variable, default=default, as_value=as_value)

get_from_setting = register.tag(get_from_setting)
0 голосов
/ 23 ноября 2011

И IanSR, и bchhun предложили переопределить TEMPLATE_CONTEXT_PROCESSORS в настройках. Имейте в виду, что этот параметр имеет значение по умолчанию, которое может вызвать некоторые неприятные вещи, если вы переопределите его, не переустанавливая значения по умолчанию. Значения по умолчанию также изменились в последних версиях Django.

https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors

TEMPLATE_CONTEXT_PROCESSORS по умолчанию:

TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.contrib.messages.context_processors.messages")
...