我有一些东西在设置。py,我想能够从模板访问,但我不知道如何做到这一点。我已经试过了
{{CONSTANT_NAME}}
但这似乎并不奏效。这可能吗?
我有一些东西在设置。py,我想能够从模板访问,但我不知道如何做到这一点。我已经试过了
{{CONSTANT_NAME}}
但这似乎并不奏效。这可能吗?
当前回答
在Django 2.0+中添加了一个完整的创建自定义模板标签的答案
在你的app文件夹中,创建一个名为templatetags的文件夹。在其中,创建__init__.py和custom_tags.py:
在custom_tags.py中创建一个自定义标记函数,用于访问settings常量中的任意键:
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" %}
此解决方案不适用于数组,但如果需要,则可能需要在模板中放入太多逻辑。
注意:一个更清晰、更安全的解决方案可能是创建一个自定义上下文处理器,在其中添加所有模板可用的上下文所需的设置。这样可以降低在模板中错误地输出敏感设置的风险。
其他回答
上面来自bchhun的例子很好,只是你需要从settings.py显式地构建上下文字典。下面是一个未经测试的示例,说明如何从settings.py的所有大写属性(re: "^[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',
...
)
对于那些想要使用@Berislav的方法(自定义模板标签)和if标签的人:
/ app / templatetags / my_settings.py:
from django import template
from django.conf import settings
register = template.Library()
@register.simple_tag
def settings_value(name):
return getattr(settings, name, "")
模板文件:
<!-- Load your tags -->
{% load my_settings %}
{% settings_value 'ENABLE_FEATURE_A' as ENABLE_FEATURE_A %}
{% if ENABLE_FEATURE_A %}
<!-- Feature A stuffs -->
{% endif %}
如果使用基于类的视图:
#
# 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 }}
查看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>
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")