2010-08-07 99 views
23

我希望能够把特定的配置信息在我的settings.py文件 - 比如网站名称,网站网址等使用Django设置模板

如果我这样做,我哪有那么访问模板中的那些设置?

感谢

回答

44

让我们在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有关于这个 online的教程。

一些有用的信息关于何时和如果上下文处理器可在这个网站上 here

里面你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) 
+1

我想在我的基本模板中使用这些设置,从其他所有其他继承,我有点拉兹年。 有什么办法可以使默认行为,使render_to_response将使用RequestContext而不是只是一个上下文?如果我可以帮忙的话,我不想在整个代码中添加相同的参数。 – Roger 2010-08-07 14:05:11

+1

你可以在render_to_response上编写一个包装函数,它将请求作为附加参数,并在该函数中:tmp_dict = RequestContext(request),tmp_dict.update(response_dict)return render_to_response('... html',tmp_dict) - 这可能让你更容易地通过搜索和替换操作改变你的代码 – Geradeausanwalt 2010-08-07 14:55:01

+0

这很好,谢谢大家。 – Roger 2010-08-08 13:29:00

2

如果你只需要一对或两对一对夫妇视图,上下文处理器可能是矫枉过正,因为它会将它们添加到您的应用程序中的所有视图。但是如果它在很多模板中使用,竞争处理器就是要走的路。

对于简单的一关的情况下只是通过任何设置,您从视图模板需要:

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

如果使用类基于查看:

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