2009-07-01 127 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))