2009-07-01 70 views
2

就像一個很好的小編碼器,我所有的Django模板都是從base.html繼承而來的。現在我想添加一些功能到基地總是顯示一些有趣的事情。有些用戶統計數據,或隨機的帖子,或飼料等如何將數據從Django中的任何視圖傳遞到任何模板?

所有我的看法是這樣的:

def viewname(request) : 
    template_vales = {} 
    // Stuff 
    return render_to_response('some_file_name.html', template_values) 

我怎樣才能讓這個template_values的值總是填充我所有的意見?在我的所有觀點開始時,我必須這樣做嗎?如:

import utils 

def viewname(request) : 
    template_values = {} 
    utils.addDefaults(template_values) 
    // Stuff 
    return render_to_response('some_file_name.html', template_values) 

或者還有更好的方法嗎?

回答

9

你應該用context處理器:

http://docs.djangoproject.com/en/dev/ref/templates/api/

http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

在我的settings.py,我加了幾個功能,通用的標準(見最後兩個):

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.request", 
    "django.core.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "thetrailbehind.context_processors.canonical_url", 
    "thetrailbehind.context_processors.gmapkey",) 

我添加的第一個定義了視圖的規範URL和GMap鍵之間的第二個切換。下面是一個函數:

def gmapkey(request): 
    url = request.META['HTTP_HOST'] 
    key = "" 
    if url == "127.0.0.1:8000": 
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBTpH3CbXHjuCVmaTc5MkkU4wO1RRhTaJZRNQLjBhGtJlm6eE4gJtku-Rw" 
    elif url == "192.168.11.3:8000": 
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBTm8-wcGRt2V-0p00qdRdGeyDhtGBSRTbk2s1ciA8vzdxGeAnqq6g-F4g" 
    elif url == "192.168.11.17:7000": 
    key="ABQIAAAAmHGaJpkZhJ6huJ93yfaYERTmT93Y0kqi8UE3J2QowoLz6rHdtxTHqeJ0nRoENl5LY5gCqHhRK9Yasg" 
    elif url == "192.168.1.200:8000": 
    key="ABQIAAAAmHGaJpkZhJ6huJ93yfaYERR5_sKpsr8Ui4YjC4HGOe8xaUDeVhSxGV1r1rIL1OvmVMAGUQBoUK0H2w" 
    elif url == "192.168.1.73:8000": 
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBR7_CRKSBu49YjvDOLq_-DZQHSIYBSip9sO5IHlFIoZMtDpVcduFQCnWg" 
    elif url == "www.trailbehind.com": 
    key="ABQIAAAAGFSvsJjnPmsGb7IcfqoamBQxFGSDsNggDdRtUnAb8L8sJ910FhSKwoOpNaUlGCQIhyl6Dy5Cbyb0lQ" 
    elif url == "dev.trailbehind.com": 
    key="ABQIAAAAmHGaJpkZhJ6huJ93yfaYERQzqIbhF_xOwOwM1oDO_kQqYhag7BRsoTInq2lBuE7fsgDN2xfyD2IL5A" 
    elif url == "trailbehind.com": 
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBQL9YYTGyB2pLTiscy54DOfsaXeHBQqMBmq7UvWAZVenmRMtNr_bo3TMQ" 
    elif url == "tenuki.trailbehind.com": 
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBQ5SkJUKVREyqcvaNQJsRscGi2yVhSj0mJSTasDiWec8Awxb_TUxOdElw" 
    elif url == "cabin.trailbehind.com": 
    key = "ABQIAAAAmHGaJpkZhJ6huJ93yfaYERSU-76xxg1tvy-8taAiiF1qqcGi1xSmjUhmAs_v2XAuGxKX_Y-4-gDP3Q" 
    elif url == "ec2-174-129-167-234.compute-1.amazonaws.com": 
    key = "ABQIAAAAmHGaJpkZhJ6huJ93yfaYERStHq7nubctzsNDgkYc34LoSNrRNhQVCNy2KFFm2BT1sG2yrXrw38ycNg" 
+0

所以我需要 從django.template進口的RequestContext 和 選擇render_to_response返回( 「程序my_app/my_template.html」,{ 'some_var': '富'}, context_instance = RequestContext的(請求))在每一個視圖 ?我希望這個教程能讓我開始走上這條道路。謝謝! – 2009-07-01 22:32:29

4

爲此,我使用context處理器。例如,如果我想爲每個視圖獲取變量MEDIA_URL,我定義context_processors.py這樣的:

def media_url(request): 
    from django.conf import settings 
    return {'MEDIA_URL': settings.MEDIA_URL} 

settings.py您必須

TEMPLATE_CONTEXT_PROCESSORS = (
    .... 
    'django.core.context_processors.request', 
    'myaplication.context_processors.menuitems', 
) 

鑑於你必須有render_to_responsecontext_instance=RequestContext(request) 例如:

def my_view(request): 
return render_to_response('base.html',{}, 
           context_instance=RequestContext(request)) 
相關問題