django:为什么 RequestContext 设置为 context_instance?

Pau*_*jan 4 django django-templates

似乎大多数文档都建议:

template_values = {}
template_values["foo"] = "bar"
return render_to_response(path, template_values, context_instance=RequestContext(request)
Run Code Online (Sandbox Code Playgroud)

为什么我不使用:

template_values = RequestContext(request)
template_values["foo"] = "bar"
return render_to_response(path, template_values)
Run Code Online (Sandbox Code Playgroud)

Cid*_*ide 5

RequestContext不继承自dict,因此不能保证实现所有dict的方法(并且它没有),并且任何对 dict 进行操作的函数也可能无法工作。最后,没有理由这样做;最好将其视为其实现可能会更改的不透明对象。使用 adict提供模板的上下文具有RequestContext.

更新

为了生成更少的样板代码,这里有两个我使用的实用函数。我将它们放在我项目底部的一个shortcuts.py 文件中。

from django.template import RequestContext
def render_template(request, template, data=None):
    "Wrapper around render_to_response that fills in context_instance for you."
    response = render_to_response(template, data,
                              context_instance=RequestContext(request))
    return response

def boilerplate_render(template):
    "Factory function for creating simple views that only forward to a template"
    def view(request, **kwargs):
        response = render_template(request, template, kwargs)
        return response
    return view
Run Code Online (Sandbox Code Playgroud)

用法:

def my_view(request):
    # Do stuff here...
    return render_template(request, 'my_template.html', {'var1': 'value', etc..})

my_view2 = boilerplate_render('my_template2.html') # Takes no context parameters
Run Code Online (Sandbox Code Playgroud)