一尘不染

可以从Django中的模板访问settings.py中的常量吗?

django

我希望通过模板访问settings.py中的一些内容,但是我不知道该怎么做。我已经试过了

{{CONSTANT_NAME}}

但这似乎不起作用。可能吗?


阅读 687

收藏
2020-03-26

共3个答案

一尘不染

settings.MEDIA_URL如果你使用django的内置通用视图或在render_to_response快捷方式函数中传递上下文实例关键字参数,则Django提供对模板的某些经常使用的设置常量的访问,例如和某些语言设置。这是每种情况的示例:

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

2020-03-26
一尘不染

我发现最简单的方法是单个自定义模板标签:

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" %}
2020-03-26
一尘不染

如果你希望每个请求和模板都具有此值,则使用上下文处理器更为合适。

就是这样:

  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}
  1. 将上下文处理器添加到settings.py文件中:
TEMPLATES = [{
    # whatever comes before
    'OPTIONS': {
        'context_processors': [
            # whatever comes before
            "your_app.context_processors.admin_media",
        ],
    }
}]
  1. RequestContext在视图中使用可以在模板中添加上下文处理器。该render快捷方式自动执行此操作:
from django.shortcuts import render

def my_view(request):
    return render(request, "index.html")
  1. 最后,在你的模板中:
...
<a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a>
...
2020-03-26