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",
],
}
}]
14 回答
另一种方法是创建一个自定义模板标记,它可以让您从设置中捕获值 .
然后你可以使用:
在任何页面上打印它,而不跳过上下文处理器箍 .
IanSR和bchhun都建议在设置中覆盖TEMPLATE_CONTEXT_PROCESSORS . 请注意,如果您在不重新设置默认值的情况下覆盖它,则此设置有一个默认设置可能会导致一些棘手的事情 . 在最新版本的Django中,默认值也发生了变化 .
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
默认TEMPLATE_CONTEXT_PROCESSORS:
我发现最简单的方法是单个模板标记:
用法:
如果我们要在单个变量上比较上下文与模板标签,那么了解更有效的选项可能是有益的 . 但是,您最好只从需要该变量的模板中进入设置 . 在这种情况下,将变量传递到所有模板中是没有意义的 . 但是,如果您要将变量发送到公共模板(例如base.html模板),那么随着base.html模板在每个请求上呈现都无关紧要,因此您可以使用任一方法 .
如果您决定使用模板标签选项,那么请使用以下代码,因为它允许您传入 default 值,以防未定义变量问题 .
示例:get_from_settings my_variable为my_context_value
示例:get_from_settings my_variable my_default为my_context_value
我改进了chrisdew's answer(创建自己的标签) .
首先,创建文件
yourapp/templatetags/value_from_settings.py
,在其中定义自己的新标记value_from_settings
:您可以通过以下方式在模板中使用此标记:
或通过
as ...
符号的优点在于,通过简单的{{my_fqdn}}
可以轻松地在blocktrans
块中使用 .如果使用基于类的视图:
如果有人像我一样发现了这个问题,那么我将发布我的解决方案,该解决方案适用于Django 2.0:
此标记将一些settings.py变量值分配给模板的变量:
用法:
{% get_settings_value template_var "SETTINGS_VAR" %}
app / templatetags / my_custom_tags.py:
您的模板:
请参阅Django的文档,如何在此处创建自定义模板标记:https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
如果's a value you'd喜欢每个请求和模板,使用context processor更合适 .
这是如何做:
context_processors.py
文件 . 假设我想在每个上下文中都有ADMIN_PREFIX_VALUE
值:RequestContext
在模板中添加上下文处理器 . render shortcut会自动执行此操作:bchhun上面的例子很好,除了你需要从settings.py显式构建你的上下文字典 . 下面是一个UNTESTED示例,说明如何从settings.py的所有大写属性中自动构建上下文字典(re:“^ [A-Z0-9_] $”) .
在settings.py结束时:
查看django-settings-export(免责声明:我是这个项目的作者) .
例如...
settings.py
template.html
我喜欢Berislav的解决方案,因为在简单的网站上,它是干净而有效的 . 我不喜欢的是无所不在地暴露所有设置常量 . 所以我最终做的是这样的:
用法:
这可以保护您未在模板中使用的任何常量,如果您想获得真正的幻想,可以在设置中设置元组,并为不同的页面,应用或区域创建多个模板标记,并简单地根据需要将本地元组与设置元组组合,然后执行列表推导以查看该值是否可接受 .
我同意,在一个复杂的网站上,这有点过于简单,但有一些值很高兴在模板中普遍使用,这似乎很好用 . 感谢Berislav最初的想法!
我发现这是Django 1.3最简单的方法:
如果您使用django的内置通用视图或在
render_to_response
快捷方式函数中传入上下文实例关键字参数,Django可以访问模板的某些常用设置常量,如settings.MEDIA_URL
和某些语言设置 . 以下是每个案例的示例:这些视图都有几个常用的设置,如
settings.MEDIA_URL
,模板可用作{{ MEDIA_URL }}
等 .如果你正在寻找访问中的其他常量设置,然后只需解压缩所需的常量,并将它们添加到您在视图函数中使用的上下文字典中,如下所示:
现在,您可以在模板上以
{{ favorite_color }}
访问settings.FAVORITE_COLOR
.使用Django 2.0添加一个答案,其中包含用于创建解决此问题的自定义模板标记的完整说明
在您的app-folder中,创建一个名为 templatetags 的文件夹 . 在其中,创建 init.py 和 custom_tags.py :
在 custom_tags.py 中创建一个自定义标记函数,该函数提供对设置常量中任意键的访问:
要理解这段代码,我建议在Django文档中阅读the section on simple tags .
然后,您需要通过将此文件加载到您将使用它的任何模板中,使Django知道此(以及任何其他)自定义标记 . 就像你需要加载内置静态标记一样:
加载后,它可以像任何其他标签一样使用,只需提供您需要返回的特定设置 . 因此,如果您的设置中有BUILD_VERSION变量:
此解决方案不适用于数组,但如果您需要,您可能会在模板中添加许多逻辑 .