在模板中使用Django设置

28 投票
3 回答
29051 浏览
提问于 2025-04-16 02:28

我想在我的settings.py文件里放一些配置的信息,比如网站名称、网站网址等等。

如果我这样做了,怎么才能在模板里访问这些设置呢?

谢谢

3 个回答

3

如果你只需要为几个页面设置一两个选项,使用上下文处理器可能有点大材小用,因为它会把这些设置应用到你应用里的所有页面。不过,如果你在很多模板中都需要用到这些设置,使用上下文处理器就很合适了。

对于简单的单次需求,只需从视图把需要的设置传递到模板就可以了:

from django.conf import settings
from django.shortcuts import render_to_response

def some_view(request):
    val = settings.SAVED_SETTING
    return render_to_response("index.html", {
        'saved_setting':val
    })

然后在你的模板中通过以下方式访问这些设置:

{{ saved_setting }}
5

如果你在使用基于类的视图:

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

假设在你的 settings.py 文件里,你有:

SITE_URL='www.mydomain.tld/somewhere/'
SITE_NAME='My site'

如果你只在一两个视图中需要这些内容:

from django.shortcuts import render_to_response
from django.conf import settings

def my_view(request, ...):
    response_dict = {
        'site_name': settings.SITE_NAME,
        'site_url': settings.SITE_URL,
    }
    ...
    return render_to_response('my_template_dir/my_template.html', response_dict)

如果你需要在很多应用和/或视图中访问这些内容,你可以写一个上下文处理器来节省代码:

James 有一个关于这个的教程,在线可以查看

关于上下文处理器的使用时机和条件,这个网站上也有一些有用的信息,可以在这里找到

在你的 my_context_processors.py 文件中,你需要:

from django.conf import settings

def some_context_processor(request):
    my_dict = {
        'site_url': settings.SITE_URL,
        'site_name': settings.SITE_NAME,
    }

    return my_dict

然后回到你的 settings.py 文件,激活它的方法是:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...

    # yours
    'my_context_processors.some_context_processor',
)

在你的 views.py 文件中,让一个视图使用它,像这样:

from django.shortcuts import render_to_response
from django.template import RequestContext

def my_view(request, ...):  
    response_dict = RequestContext(request)
    ...
    # you can still still add variables that specific only to this view
    response_dict['some_var_only_in_this_view'] = 42
    ...
    return render_to_response('my_template_dir/my_template.html', response_dict)

撰写回答