템플릿에서 액세스 할 수있는 settings.py에 몇 가지 물건이 있지만 그것을 수행하는 방법을 알 수는 없습니다. 나는 이미 시도했다
{{CONSTANT_NAME}}
그러나 그것은 작동하지 않는 것 같습니다. 이것이 가능한가?
템플릿에서 액세스 할 수있는 settings.py에 몇 가지 물건이 있지만 그것을 수행하는 방법을 알 수는 없습니다. 나는 이미 시도했다
{{CONSTANT_NAME}}
그러나 그것은 작동하지 않는 것 같습니다. 이것이 가능한가?
답변:
Django는 settings.MEDIA_URL
django의 내장 된 일반 뷰를 사용하거나 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 }}
.
django-settings-export
모든 뷰에서이 코드를 작성하지 않아도되도록 살펴보십시오 .
모든 요청 및 템플릿에 대해 원하는 값이면 컨텍스트 프로세서를 사용하는 것이 더 적합합니다.
방법은 다음과 같습니다.
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}
컨텍스트 프로세서를 settings.py 파일에 추가하십시오 .
TEMPLATES = [{
# whatever comes before
'OPTIONS': {
'context_processors': [
# whatever comes before
"your_app.context_processors.admin_media",
],
}
}]
사용 RequestContext
템플릿에 상황에 맞는 프로세서를 추가하는보기에. render
바로 가기가 자동으로 수행합니다 :
from django.shortcuts import render
def my_view(request):
return render(request, "index.html")
마지막으로 템플릿에서 :
...
<a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a>
...
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
가장 간단한 접근 방식이 단일 사용자 정의 템플릿 태그 라는 것을 알았습니다 .
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" %}
{% settings_value "DATABASES" %}
? 이 사용 사례를 통해 템플릿에서 설정을 사용할 수없는 이유를 분명히 알 수 있습니다.
templatetags
빈 __init__.py
파일 과이 settings.py
폴더 안에있는 이 코드를 사용 하여 앱 내에 폴더를 만듭니다 . 2) 템플릿에서 추가 {% load settings %}
하고 새 태그를 사용하십시오!
체크 아웃 django-settings-export
(면책 조항 : 나는이 프로젝트의 저자입니다).
예를 들어 ...
$ pip install django-settings-export
TEMPLATES = [
{
'OPTIONS': {
'context_processors': [
'django_settings_export.settings_export',
],
},
},
]
MY_CHEESE = 'Camembert';
SETTINGS_EXPORT = [
'MY_CHEESE',
]
<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에 감사드립니다!
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
가 False
없습니다.
if
진술 문 에서 이것을 어떻게 사용할 수 있습니까? DEBUG
값 을 확인하고 싶습니다
나는 자신의 태그를 만들기 위해 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}}
.
Django 2.0 이상을 사용하여이를 해결하는 사용자 정의 템플릿 태그 작성에 대한 완전한 지시 사항으로 답변 추가
앱 폴더에서 templatetags 라는 폴더를 만듭니다 . 여기에 __init__.py 및 custom_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" %}
이 솔루션은 배열에서 작동하지 않지만 필요한 경우 템플릿에 많은 논리를 적용 할 수 있습니다.
참고 :보다 깨끗하고 안전한 솔루션은 모든 템플릿에서 사용 가능한 컨텍스트에 필요한 설정을 추가하는 사용자 지정 컨텍스트 프로세서를 만드는 것입니다. 이렇게하면 실수로 템플릿의 민감한 설정을 출력 할 위험을 줄일 수 있습니다.
이 코드를 다음 파일에 추가하십시오 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.py 및 context_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,
}
SECRET_KEY
. 해커는이 기능을 악용하여 템플릿에 이러한 정보를 표시 할 수 있습니다.
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',
...
)
누군가 내가했던 것처럼이 질문을 찾으면 Django 2.0에서 작동하는 솔루션을 게시 할 것입니다.
이 태그는 일부 settings.py 변수 값을 템플릿 변수에 할당합니다.
용법: {% get_settings_value template_var "SETTINGS_VAR" %}
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의 문서를 참조하십시오.
{% if settings_debug %}
{% if settings_debug == True %}
제안으로 변경{% if settings_debug %}
클래스 기반보기를 사용하는 경우 :
#
# 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 }}
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")
단일 변수에서 컨텍스트 태그와 템플릿 태그를 비교하는 경우보다 효율적인 옵션을 아는 것이 유익 할 수 있습니다. 그러나 해당 변수가 필요한 템플릿에서만 설정을 사용하는 것이 좋습니다. 이 경우 변수를 모든 템플릿에 전달하는 것은 의미가 없습니다. 그러나 변수를 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)