Использование настроек Django в шаблонах

Я хочу иметь возможность помещать определенную информацию о конфигурации в свой файл settings.py - например, имя сайта, URL-адрес сайта и т. Д.

Если я сделаю это, как я смогу получить доступ к этим настройкам в шаблонах?

Спасибо


person Roger    schedule 07.08.2010    source источник


Ответы (3)


Допустим, в вашем settings.py файле есть:

SITE_URL='www.mydomain.tld/somewhere/'
SITE_NAME='My site'

Если вам нужно всего лишь одно или два просмотра:

from django.shortcuts import render_to_response
from django.conf import settings

def my_view(request, ...):
    response_dict = {
        'site_name': settings.SITE_NAME,
        'site_url': settings.SITE_URL,
    }
    ...
    return render_to_response('my_template_dir/my_template.html', response_dict)

Если вам нужно получить к ним доступ в большом количестве приложений и / или представлений, вы можете написать обработчик контекста для сохранения кода:

У Джеймса есть руководство по этому в Интернете < / а>.

Некоторая полезная информация о том, когда и если контекстные процессоры доступны на этом самом сайте здесь.

Внутри вашего my_context_processors.py файла вы должны:

from django.conf import settings

def some_context_processor(request):
    my_dict = {
        'site_url': settings.SITE_URL,
        'site_name': settings.SITE_NAME,
    }

    return my_dict

Вернувшись в свой settings.py, активируйте его, выполнив:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...

    # yours
    'my_context_processors.some_context_processor',
)

В вашем views.py сделайте так, чтобы представление использовало его так:

from django.shortcuts import render_to_response
from django.template import RequestContext

def my_view(request, ...):  
    response_dict = RequestContext(request)
    ...
    # you can still still add variables that specific only to this view
    response_dict['some_var_only_in_this_view'] = 42
    ...
    return render_to_response('my_template_dir/my_template.html', response_dict)
person Geradeausanwalt    schedule 07.08.2010
comment
Я хочу использовать эти настройки в своем базовом шаблоне, от которого наследуются все остальные, и я немного поленился. Есть ли способ сделать поведение по умолчанию, чтобы render_to_response использовал RequestContext, а не просто Context? Я не хочу, чтобы мне приходилось добавлять одни и те же параметры во весь мой код, если я могу помочь. - person Roger; 07.08.2010
comment
Вы можете написать функцию-оболочку вокруг render_to_response, которая принимает запрос в качестве дополнительного аргумента, и в этой функции: tmp_dict = RequestContext (request), tmp_dict.update (response_dict) return render_to_response ('... html', tmp_dict) - это может сделать вам будет проще изменить свой код везде с помощью операций поиска и замены - person Geradeausanwalt; 07.08.2010
comment
это здорово, спасибо всем. - person Roger; 08.08.2010
comment
Он продублирован, см. Также stackoverflow.com/questions/433162/ - person Tony; 23.08.2014

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

#
# 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 }}
person Bill Paetzke    schedule 28.04.2013

Если вам нужен только параметр или два для пары представлений, Context Processor может оказаться излишним, поскольку он добавит их во ВСЕ представления в вашем приложении. Но если он используется во многих шаблонах, Contest Processor - это то, что вам нужно.

Для простого одноразового случая просто передайте любые настройки, которые вам нужны, из представления в шаблон:

from django.conf import settings
from django.shortcuts import render_to_response

def some_view(request):
    val = settings.SAVED_SETTING
    return render_to_response("index.html", {
        'saved_setting':val
    })

И получите доступ к настройке в вашем шаблоне через:

{{ saved_setting }}
person Brian Stoner    schedule 07.08.2010