2010-08-07 137 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 }}