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

2024-04-27 02:59:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在settings.py中有一些东西想从模板中访问,但是我不知道怎么做。我已经试过了

{{CONSTANT_NAME}}

但这似乎行不通。这可能吗?


Tags: namepy模板settingsconstant
3条回答

我发现最简单的方法是使用单个custom template tag

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

如果使用Django内置的泛型视图或在render_to_response快捷函数中传入上下文实例关键字参数,Django将提供对模板的某些常用设置常量(如settings.MEDIA_URL)和某些语言设置的访问。下面是每个案例的一个例子:

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 }}的身份访问模板上的settings.FAVORITE_COLOR

如果您希望每个请求模板都有一个值,那么使用context processor更合适。

以下是方法:

  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}
    
  2. 将上下文处理器添加到settings.py文件:

    TEMPLATES = [{
        # whatever comes before
        'OPTIONS': {
            'context_processors': [
                # whatever comes before
                "your_app.context_processors.admin_media",
            ],
        }
    }]
    
  3. 在视图中使用RequestContext将上下文处理器添加到模板中。^{} shortcut自动执行此操作:

    from django.shortcuts import render
    
    def my_view(request):
        return render(request, "index.html")
    
  4. 最后,在您的模板中:

    ...
    <a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a>
    ...
    

相关问题 更多 >