【问题标题】:How can I pass data to any template from any view in Django?如何从 Django 中的任何视图将数据传递给任何模板?
【发布时间】:2010-11-07 11:30:25
【问题描述】:

就像一个优秀的小程序员一样,我所有的 Django 模板都继承自 base.html。现在我想在基础上添加一些功能,以始终显示一些有趣的东西。一些用户统计,或随机发帖,或提要等。

我所有的观点都是这样的:

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)

或者有没有更好的方法?

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    你应该使用上下文处理器:

    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"
    

    【讨论】:

    • 所以我需要 from django.template import RequestContext 并在每个视图中返回 render_to_response("my_app/my_template.html", {'some_var': 'foo'}, context_instance=RequestContext(request)) ?我希望本教程能让我走上这条路。谢谢!
    • 是的,这是我的视图函数之一: def parks_by_state(request): '''a map with polygons for all states''' states = EncodedState.objects.all() page_title = 'Park Maps按状态' response_dict = {'states':make_json_states(states), 'page_title':page_title,} return render_to_response("state_map.html", response_dict, context_instance=RequestContext(request))
    【解决方案2】:

    为此,我使用上下文处理器。例如,如果我想为每个视图获取变量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))
    

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 2021-08-26
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2019-02-16
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多