[django] Django의 템플릿에서 settings.py의 상수에 액세스 할 수 있습니까?

템플릿에서 액세스 할 수있는 settings.py에 몇 가지 물건이 있지만 그것을 수행하는 방법을 알 수는 없습니다. 나는 이미 시도했다

{{CONSTANT_NAME}}

그러나 그것은 작동하지 않는 것 같습니다. 이것이 가능한가?



답변

Django는 settings.MEDIA_URLdjango의 내장 된 일반 뷰를 사용하거나 render_to_response바로 가기 함수 에서 컨텍스트 인스턴스 키워드 인수를 전달하는 경우 자주 사용되는 특정 설정 상수 및 일부 언어 설정에 대한 액세스를 제공 합니다. 각 사례의 예는 다음과 같습니다.

from django.shortcuts import render_to_response
from django.template import RequestContext
from django.views.generic.simple import direct_to_template

def my_generic_view(request, template='my_template.html'):
    return direct_to_template(request, template)

def more_custom_view(request, template='my_template.html'):
    return render_to_response(template, {}, context_instance=RequestContext(request))

이보기에는 모두 settings.MEDIA_URL템플릿에서 사용할 수있는 것과 같이 자주 사용되는 몇 가지 설정이 있습니다 {{ MEDIA_URL }}.

설정에서 다른 상수에 액세스하려는 경우 원하는 상수의 압축을 풀고 뷰 함수에서 사용하는 컨텍스트 사전에 다음과 같이 추가하십시오.

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

def my_view_function(request, template='my_template.html'):
    context = {'favorite_color': settings.FAVORITE_COLOR}
    return render_to_response(template, context)

이제 settings.FAVORITE_COLOR템플릿에서로 액세스 할 수 있습니다 {{ favorite_color }}.


답변

모든 요청 및 템플릿에 대해 원하는 값이면 컨텍스트 프로세서를 사용하는 것이 더 적합합니다.

방법은 다음과 같습니다.

  1. context_processors.py앱 디렉토리에 파일을 만드십시오 . ADMIN_PREFIX_VALUE모든 상황 에서 가치 를 갖고 싶다고 가정 해 봅시다 .

    from django.conf import settings # import the settings file
    
    def admin_media(request):
        # return the value you want as a dictionnary. you may add multiple values in there.
        return {'ADMIN_MEDIA_URL': settings.ADMIN_MEDIA_PREFIX}
  2. 컨텍스트 프로세서를 settings.py 파일에 추가하십시오 .

    TEMPLATES = [{
        # whatever comes before
        'OPTIONS': {
            'context_processors': [
                # whatever comes before
                "your_app.context_processors.admin_media",
            ],
        }
    }]
  3. 사용 RequestContext템플릿에 상황에 맞는 프로세서를 추가하는보기에. render바로 가기가 자동으로 수행합니다 :

    from django.shortcuts import render
    
    def my_view(request):
        return render(request, "index.html")
  4. 마지막으로 템플릿에서 :

    ...
    <a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a>
    ...

답변

가장 간단한 접근 방식이 단일 사용자 정의 템플릿 태그 라는 것을 알았습니다 .

from django import template
from django.conf import settings

register = template.Library()

# settings value
@register.simple_tag
def settings_value(name):
    return getattr(settings, name, "")

용법:

{% settings_value "LANGUAGE_CODE" %}


답변

체크 아웃 django-settings-export(면책 조항 : 나는이 프로젝트의 저자입니다).

예를 들어 …

$ pip install django-settings-export

settings.py

TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                'django_settings_export.settings_export',
            ],
        },
    },
]

MY_CHEESE = 'Camembert';

SETTINGS_EXPORT = [
    'MY_CHEESE',
]

template.html

<script>var MY_CHEESE = '{{ settings.MY_CHEESE }}';</script>


답변

이를 수행하는 또 다른 방법은 설정에서 값을 가져올 수있는 사용자 지정 템플릿 태그를 만드는 것입니다.

@register.tag
def value_from_settings(parser, token):
    try:
        # split_contents() knows not to split quoted strings.
        tag_name, var = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
    return ValueFromSettings(var)

class ValueFromSettings(template.Node):
    def __init__(self, var):
        self.arg = template.Variable(var)
    def render(self, context):
        return settings.__getattr__(str(self.arg))

그런 다음 다음을 사용할 수 있습니다.

{% value_from_settings "FQDN" %}

컨텍스트 프로세서 후프를 뛰어 넘지 않고 모든 페이지에 인쇄 할 수 있습니다.


답변

간단한 사이트에서는 깨끗하고 효과적이기 때문에 Berislav의 솔루션을 좋아합니다. 내가 싫어하는 것은 모든 설정 상수를 노출시키는 것입니다. 그래서 내가 끝낸 것은 이것입니다.

from django import template
from django.conf import settings

register = template.Library()

ALLOWABLE_VALUES = ("CONSTANT_NAME_1", "CONSTANT_NAME_2",)

# settings value
@register.simple_tag
def settings_value(name):
    if name in ALLOWABLE_VALUES:
        return getattr(settings, name, '')
    return ''

용법:

{% settings_value "CONSTANT_NAME_1" %}

이를 통해 템플릿에서 이름을 지정하지 않은 상수를 보호 할 수 있으며 정말 화려하고 싶다면 설정에서 튜플을 설정하고 다른 페이지, 앱 또는 영역에 대해 하나 이상의 템플릿 태그를 만들 수 있습니다. 필요에 따라 로컬 튜플과 설정 튜플을 결합한 다음 목록 이해를 수행하여 값이 허용 가능한지 확인하십시오.
복잡한 사이트에서 이것은 약간 단순하지만 템플릿에 보편적으로 사용하기에 좋은 값이 있으며 이것이 잘 작동하는 것 같습니다. 독창적 인 아이디어에 대한 Berislav에 감사드립니다!


답변

나는 자신의 태그를 만들기 위해 chrisdew의 답변을 약간 개선 했습니다 .

먼저 yourapp/templatetags/value_from_settings.py새 태그를 정의 할 파일 을 만듭니다 value_from_settings.

from django.template import TemplateSyntaxError, Variable, Node, Variable, Library
from yourapp import settings

register = Library()
# I found some tricks in URLNode and url from defaulttags.py:
# https://code.djangoproject.com/browser/django/trunk/django/template/defaulttags.py
@register.tag
def value_from_settings(parser, token):
  bits = token.split_contents()
  if len(bits) < 2:
    raise TemplateSyntaxError("'%s' takes at least one " \
      "argument (settings constant to retrieve)" % bits[0])
  settingsvar = bits[1]
  settingsvar = settingsvar[1:-1] if settingsvar[0] == '"' else settingsvar
  asvar = None
  bits = bits[2:]
  if len(bits) >= 2 and bits[-2] == 'as':
    asvar = bits[-1]
    bits = bits[:-2]
  if len(bits):
    raise TemplateSyntaxError("'value_from_settings' didn't recognise " \
      "the arguments '%s'" % ", ".join(bits))
  return ValueFromSettings(settingsvar, asvar)

class ValueFromSettings(Node):
  def __init__(self, settingsvar, asvar):
    self.arg = Variable(settingsvar)
    self.asvar = asvar
  def render(self, context):
    ret_val = getattr(settings,str(self.arg))
    if self.asvar:
      context[self.asvar] = ret_val
      return ''
    else:
      return ret_val

다음을 통해 템플릿에서이 태그를 사용할 수 있습니다.

{% load value_from_settings %}
[...]
{% value_from_settings "FQDN" %}

또는 통해

{% load value_from_settings %}
[...]
{% value_from_settings "FQDN" as my_fqdn %}

as ...표기법 의 장점은 blocktrans간단한 방법으로 블록 에서 쉽게 사용할 수 있다는 것입니다 {{my_fqdn}}.