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


367

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

{{CONSTANT_NAME}}

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


모든 답변에 설정을 전달하는 방법을 찾고 있다면 컨텍스트 프로세서에 대한 bchunn의 답변을보십시오
Zags

1
@jkbrzt의 답변은이 문제를 빠르고 쉽게 해결하는 사전 패키지 솔루션입니다. 미래의 독자들은 이것 좀해야 stackoverflow.com/a/25841039/396005 허용 대답 오버
브롱 데이비스에게

답변:


183

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 }}.


66
RequestContext를 사용하여 추가 된 특정 값은 TEMPLATE_CONTEXT_PROCESSORS의 값에 따라 달라집니다. 따라서 추가 값을 모든 곳에 전달하려면 자체 컨텍스트 프로세서를 작성하여 TEMPLATE_CONTEXT_PROCESSORS에 추가하십시오.
Carl Meyer

일관성에 대한 관점, 일반 뷰 및 많은 핵심 및 Contrib 앱에서 추가 컨텍스트를 extra_context라고하며, 종종 뷰의 인수에 포함됩니다.
Soviut

"Django는 settings.MEDIA_URL과 같이 템플릿에 자주 사용되는 특정 설정 상수에 대한 액세스를 제공합니다." Django 1.3에서는 작동하지 않는 것 같습니다. 아마도 잘못 사용하고 있습니다. 이 기능에 대한 설명서가 있습니까?
SystemParadox

1
@asofyan 예, 추가 사용자 정의 템플릿 컨텍스트 프로세서를 만들고 settings.py에서 TEMPLATE_CONTEXT_PROCESSORS에 추가하십시오.
Paolo

14
django-settings-export모든 뷰에서이 코드를 작성하지 않아도되도록 살펴보십시오 .
qris

441

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

방법은 다음과 같습니다.

  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>
    ...

32
@MarkEssel이 후프는 RequestContext 함수를 사용하는 한 모든 뷰에서 변수에 액세스 할 수 있도록 만들어졌습니다. 모든보기에서 항상 설정 변수를 수동으로 가져올 수 있습니다. 나는 좋은 ol 'Copy & paste 대신 언제든지 재사용 가능한 Context Processor를 선택하고 싶습니다.
bchhun

5
가능한 모든 곳에서 복사 / 붙여 넣기를 피하기 위해 최선을 다하고 있습니다. 프로젝트 내 각각의 모든 응용 프로그램에 context_processor.py가 필요합니까? 모든 응용 프로그램에 대해 하나의 context_processor를 구성하는 방법이 있습니까?
Mark Essel

10
@ bchhun 방금 테스트했습니다 (Django 1.3) : 응용 프로그램간에 컨텍스트 프로세서를 공유하면 정상적으로 작동합니다. :-) 파일 context_process.py옆에 두고 내 목록에 settings.py추가 "context_processors.admin_media"했습니다 TEMPLATE_CONTEXT_PROCESSORS. 또한 TEMPLATE_CONTEXT_PROCESSORS의 기본값이 비어 있지 않다는 사실에 대한 답변에 메모를 추가 할 수 있으므로 기존 코드가 기본 컨텍스트 프로세서에서 설정된 값을 사용하면 다시 추가하지 않으면 작동하지 않습니다. 명시 적으로 목록에.
MiniQuark

5
@MarkEssel 전혀 고통스럽지 않습니다-그는 모든 것을 철자했습니다. 실제로는 단 6 줄입니다 (1 및 2 단계). 어쨌든 대부분의 템플릿에는 3 단계와 4 단계 또는 이와 동등한 단계가 필요합니다.
Rick Westera

2
장고 1.3로, 당신은 사용할 수 있습니다 render: 명시 적으로 RequestContext를 포함하는 것을 피하기 위해 바로 가기를 docs.djangoproject.com/en/1.6/topics/http/shortcuts/#render
yndolok

269

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

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" %}

17
템플릿의 모든 설정에 대한 주문형 액세스가 마음에 듭니다. 템플릿에서 다양한 설정을 자주 사용하는 경우 다른 답변보다 훨씬 낫습니다. 1) 허용되는 답변이 클래스 기반 뷰와 호환되지 않거나 어수선합니다. 2) 과도하게 투표 된 템플릿 컨텍스트 프로세서 솔루션을 사용하면 개별 설정 (또는 모두)을 지정해야하며 템플릿을 렌더링하는 모든 단일 요청에 대해 실행되므로 비효율적입니다! 3) 위의 더 복잡한 태그보다 간단합니다.
벤 로버츠

16
@ BenRoberts 나는 이것이 우아한 솔루션이라는 것에 동의하지만 ... 모든 것을 수행하는 단일 개발자가있는 작은 프로젝트에만 해당됩니다. 설계 및 개발을 위해 별도의 인력 / 팀이있는 경우이 솔루션이 최악 일 수 있습니다. 디자이너가 다음과 같은 방법으로이 태그를 남용하지 못하게하는 방법은 무엇입니까 {% settings_value "DATABASES" %}? 이 사용 사례를 통해 템플릿에서 설정을 사용할 수없는 이유를 분명히 알 수 있습니다.
mkoistinen

23
"우리 모두 여기에 동의하는 성인들"
frnhr

11
초보자가 된 것을 용서해주세요. 이 코드를 어디에 넣습니까? Views.py? 아니면 새 파일로?
Noel Llevares

13
다른 사람들이 명확하게하려면 다음을 수행해야합니다 .1) templatetags__init__.py파일 과이 settings.py폴더 안에있는 이 코드를 사용 하여 앱 내에 폴더를 만듭니다 . 2) 템플릿에서 추가 {% load settings %}하고 새 태그를 사용하십시오!
damio

95

체크 아웃 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>

1
그리고 당신의보기에 당신은 사용할 필요가 유의 render하지render_to_response
에버렛 Toews

내가 file.Can 설정에서 'django_settings_export.settings_export'를 추가하려면 내가 잘못 여기서 뭐하는 거지 제안 할 때 템플릿에 설정에서 값을 읽을 유사한 요구 사항이 있지만 500 오류가 무엇입니까
Piyush Sahu

3
2019 년이며 프로젝트에서 사용하고 있습니다. 감사!
sivabudh

1
@sivabudh에 동의합니다. 이것은 중앙 집중식이므로 추가 폴더와 파일이 필요하지 않음을 의미합니다. 2. 템플릿에 네임 스페이스 설정이 표시되어 많은 응용 프로그램의 참조를 얻는 데 매우 도움이됩니다.
ywiyogo

46

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

@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" %}

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


6
코드를 변경하지 않고 드롭 인으로 작동하기 때문에 이것이 가장 우아한 솔루션이라고 생각합니다.
비행 양

1
응용 프로그램의 나머지 부분은 변경하지 않은 채로 둘 수 있습니다. 컨텍스트 프로세서를 추가하지 않고 하나의 태그를 추가하여 사용하십시오 (즉, 여러 곳에서 응용 프로그램을 편집해야 함)
날기 양

2
@ 마크 -에서 produi / SRC / produi / template_utils / templatetags / custom_template_filters.py template_utils settings.py INSTALLED_APPS에서 참조 - 참조 docs.djangoproject.com/en/dev/howto/custom-template-tags
fadedbee

chris의 도움을 받아 custom_template_filters를 포함한 templatetags 하위 디렉토리가있는 mutil 앱을 추가했습니다. homepage.html "잘못된 블록 태그 : 'value_from_settings', 'endblock'또는 'endblock banner'로 예상되는 오류"
Mark Essel

컨텍스트 데코레이터 버전을 사용하여 노출 할 설정을 정확하게 선택하면 "명시 적 인 것이 묵시적보다 낫습니다"라고 생각합니다.
sjh

29

간단한 사이트에서는 깨끗하고 효과적이기 때문에 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에 감사드립니다!


5
왜 간단하지if name in ALLOWABLE_VALUES: ...
frnhr

나는 영리하다고 생각하고 하위 문자열이 설정 var를 트리거하지 못하게하고 싶었습니다. ;-) 리턴은 아마 다음과 같아야합니다 : return getattr (settings, is_allowable, '')
MontyThreeCard

5
궁금한 사람을 명확히하기 위해 : 여기에는 하위 문자열 문제 'val' in ('val_first', 'second_val',)False없습니다.
frnhr

2
if진술 문 에서 이것을 어떻게 사용할 수 있습니까? DEBUG값 을 확인하고 싶습니다
AJ


12

나는 자신의 태그를 만들기 위해 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}}.


12

Django 2.0 이상을 사용하여이를 해결하는 사용자 정의 템플릿 태그 작성에 대한 완전한 지시 사항으로 답변 추가

앱 폴더에서 templatetags 라는 폴더를 만듭니다 . 여기에 __init__.pycustom_tags.py를 작성하십시오 .

맞춤 태그 폴더 구조

에서 custom_tags.py 내의 임의의 키에 대한 액세스 제공하는 사용자 정의 태그 생성 기능 설정 전율 :

from django import template
from django.conf import settings

register = template.Library()

@register.simple_tag
def get_setting(name):
    return getattr(settings, name, "")

이 코드를 이해하려면 Django 문서의 간단한 태그 섹션을 읽는 것이 좋습니다 .

그런 다음이 파일을 사용할 템플릿에이 파일을로드하여 Django가이 (및 추가) 사용자 정의 태그를 인식하도록해야합니다. 내장 정적 태그를로드해야하는 것처럼 :

{% load custom_tags %}

그것을로드하면 다른 태그와 마찬가지로 사용할 수 있습니다. 반환 해야하는 특정 설정을 제공하십시오. 따라서 설정에 BUILD_VERSION 변수가있는 경우 :

{% get_setting "BUILD_VERSION" %}

이 솔루션은 배열에서 작동하지 않지만 필요한 경우 템플릿에 많은 논리를 적용 할 수 있습니다.

참고 :보다 깨끗하고 안전한 솔루션은 모든 템플릿에서 사용 가능한 컨텍스트에 필요한 설정을 추가하는 사용자 지정 컨텍스트 프로세서를 만드는 것입니다. 이렇게하면 실수로 템플릿의 민감한 설정을 출력 할 위험을 줄일 수 있습니다.


9

이 코드를 다음 파일에 추가하십시오 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 .

예를 들어 settings / base.pycontext_processors.py를 볼 수 있습니다 .

그런 다음 모든 템플릿 코드에서 특정 설정을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

{% if settings.SITE_ID == settings.SPEEDY_MATCH_SITE_ID %}

업데이트 : 위의 코드는과 같은 민감한 정보를 포함하여 템플릿에 모든 설정을 표시합니다 SECRET_KEY. 해커는이 기능을 악용하여 템플릿에 이러한 정보를 표시 할 수 있습니다. 특정 설정 만 템플릿에 노출하려면이 코드를 대신 사용하십시오.

def settings(request):
    settings_in_templates = {}
    for attr in ["SITE_ID", ...]: # Write here the settings you want to expose to the templates.
        if (hasattr(django_settings, attr)):
            settings_in_templates[attr] = getattr(django_settings, attr)
    return {
        'settings': settings_in_templates,
    }

1
나는 어제이 문제에 부딪 히고이 게시물을 찾은 다음 2 개의 다른 게시물과 블로그 게시물을 발견했으며 그중 하나가 너무 복잡하다고 느꼈습니다 (불행히도 페이지 아래까지는 만들지 못했습니다). 그래서 나는 내 자신을 굴려서 결국이 솔루션입니다. 방금 ^ ^ 3 줄 기능과 settings.py에서 1 줄 변경시 사람들이 플러그인과 전체 lotta 코드를 추천하고 있다는 사실을 알려주기 때문에 방금 돌아 왔습니다.
DXM

@DXM 감사합니다!
빠른 경기

실제로 내 솔루션은과 같은 민감한 정보를 포함하여 모든 설정을 템플릿에 노출합니다 SECRET_KEY. 해커는이 기능을 악용하여 템플릿에 이러한 정보를 표시 할 수 있습니다.
빠른 경기

답변을 업데이트했습니다.
빠른 경기

글쎄 ... 좋아, 이제 내 웹 사이트에 같은 문제가 있습니다 :) 그러나 ... 나는 뭔가를 놓쳤을 수도 있지만 문제가 있습니까? 템플릿은 웹 사이트의 소스 코드와 본질적으로 동일합니까? 서버 측에 저장되며 프론트 엔드에서 직접 액세스 할 수 없습니다. 해커가 템플릿을 변경할 수 있으면이 시점에서 .py 파일을 변경할 수 있습니다.
DXM

8

bchhun의 위 예제는 settings.py에서 컨텍스트 사전을 명시 적으로 작성해야한다는 점을 제외하면 좋습니다. 다음은 settings.py의 모든 대문자 속성에서 컨텍스트 사전을 자동 빌드하는 방법에 대한 UNTESTED 예입니다 (예 : "^ [A-Z0-9 _] + $").

settings.py의 끝에서 :

_context = {} 
local_context = locals()
for (k,v) in local_context.items():
    if re.search('^[A-Z0-9_]+$',k):
        _context[k] = str(v)

def settings_context(context):
    return _context

TEMPLATE_CONTEXT_PROCESSORS = (
...
'myproject.settings.settings_context',
...
)

8

누군가 내가했던 것처럼이 질문을 찾으면 Django 2.0에서 작동하는 솔루션을 게시 할 것입니다.

이 태그는 일부 settings.py 변수 값을 템플릿 변수에 할당합니다.

용법: {% get_settings_value template_var "SETTINGS_VAR" %}

app / templatetags / my_custom_tags.py :

from django import template
from django.conf import settings

register = template.Library()

class AssignNode(template.Node):
    def __init__(self, name, value):
        self.name = name
        self.value = value

    def render(self, context):
        context[self.name] = getattr(settings, self.value.resolve(context, True), "")
        return ''

@register.tag('get_settings_value')
def do_assign(parser, token):
    bits = token.split_contents()
    if len(bits) != 3:
        raise template.TemplateSyntaxError("'%s' tag takes two arguments" % bits[0])
    value = parser.compile_filter(bits[2])
    return AssignNode(bits[1], value)

템플릿 :

{% load my_custom_tags %}

# Set local template variable:
{% get_settings_value settings_debug "DEBUG" %}

# Output settings_debug variable:
{{ settings_debug }}

# Use variable in if statement:
{% if settings_debug %}
... do something ...
{% else %}
... do other stuff ...
{% endif %}

https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/ 에서 Django의 문서를 참조하십시오.


1
{% if settings_debug %}
user66081

감사합니다 @ user66081! {% if settings_debug == True %}제안으로 변경{% if settings_debug %}
NullIsNot0

7

클래스 기반보기를 사용하는 경우 :

#
# 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 }}

3

나는 이것이 장고 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 }}';

1

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")

1

단일 변수에서 컨텍스트 태그와 템플릿 태그를 비교하는 경우보다 효율적인 옵션을 아는 것이 유익 할 수 있습니다. 그러나 해당 변수가 필요한 템플릿에서만 설정을 사용하는 것이 좋습니다. 이 경우 변수를 모든 템플릿에 전달하는 것은 의미가 없습니다. 그러나 변수를 base.html 템플릿과 같은 공통 템플릿으로 보내는 경우 모든 요청에서 base.html 템플릿이 렌더링되므로 두 가지 방법 중 하나를 사용할 수 있습니다.

템플릿 태그 옵션을 사용하기로 결정한 경우 다음 코드를 사용하여 기본값 을 전달할 수 있습니다 경우 변수 in-question이 정의되지 않은 경우를 대비하여 .

예 : get_from_settings my_variable을 my_context_value로

예 : get_from_settings my_variable my_default를 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)

또는 당신은 파이널웨어SITE_EXTRA_CONTEXT_DICT 에서 당신 을 위해 그것을 사용할 수 있습니다.
un33k
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.