我有一些东西在设置。py,我想能够从模板访问,但我不知道如何做到这一点。我已经试过了
{{CONSTANT_NAME}}
但这似乎并不奏效。这可能吗?
我有一些东西在设置。py,我想能够从模板访问,但我不知道如何做到这一点。我已经试过了
{{CONSTANT_NAME}}
但这似乎并不奏效。这可能吗?
当前回答
如果有人像我一样发现了这个问题,那么我将发布我的解决方案,它适用于Django 2.0:
这个标记将一些settings.py变量值赋给模板的变量:
用法:{% get_settings_value template_var "SETTINGS_VAR" %}
应用程序/ 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 %}
查看Django如何创建自定义模板标签的文档:https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
其他回答
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")
如果你希望每个请求和模板都有一个值,那么使用上下文处理器更合适。
方法如下:
Make a context_processors.py file in your app directory. Let's say I want to have the ADMIN_PREFIX_VALUE value in every context: 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} add your context processor to your settings.py file: TEMPLATES = [{ # whatever comes before 'OPTIONS': { 'context_processors': [ # whatever comes before "your_app.context_processors.admin_media", ], } }] Use RequestContext in your view to add your context processors in your template. The render shortcut does this automatically: from django.shortcuts import render def my_view(request): return render(request, "index.html") and finally, in your template: ... <a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a> ...
在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" %}
此解决方案不适用于数组,但如果需要,则可能需要在模板中放入太多逻辑。
注意:一个更清晰、更安全的解决方案可能是创建一个自定义上下文处理器,在其中添加所有模板可用的上下文所需的设置。这样可以降低在模板中错误地输出敏感设置的风险。
如果有人像我一样发现了这个问题,那么我将发布我的解决方案,它适用于Django 2.0:
这个标记将一些settings.py变量值赋给模板的变量:
用法:{% get_settings_value template_var "SETTINGS_VAR" %}
应用程序/ 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 %}
查看Django如何创建自定义模板标签的文档:https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
Django提供了对模板中某些常用的设置常量的访问,比如settings。MEDIA_URL和一些语言设置,如果你使用django内置的通用视图或在render_to_response快捷函数中传入context实例关键字参数。以下是每种情况的示例:
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)
现在你可以访问设置了。在模板中使用{{FAVORITE_COLOR}}。