Django 学习笔记(三)

来源:互联网 发布:mac ppt软件 编辑:程序博客网 时间:2024/06/07 02:29
在看Django RequestContext和Context处理器感觉比较重要,再次摘抄来此你需要一段context来解析模板。 一般情况下,这是一个 django.template.Context 的实例,不过在Django中还可以用一个特殊的子类, django.template.RequestContext ,这个用起来稍微有些不同。 RequestContext默认地在模板context中加入了一些变量,如 HttpRequest 对象或当前登录用户的相关信息。当你不想在一系例模板中都明确指定一些相同的变量时,你应该使用 RequestContext 。 例如,考虑这两个视图:from django.template import loader, Contextdef view_1(request):# ...t = loader.get_template('template1.html')c = Context({'app': 'My app','user': request.user,'ip_address': request.META['REMOTE_ADDR'],'message': 'I am view 1.'})return t.render(c)def view_2(request):# ...t = loader.get_template('template2.html')c = Context({'app': 'My app','user': request.user,'ip_address': request.META['REMOTE_ADDR'],'message': 'I am the second view.'})return t.render(c)(注意,在这些例子中,我们故意 不 使用 render_to_response() 这个快捷方法,而选择手动载入模板,手动构造context对象然后渲染模板。 是为了能够清晰的说明所有步骤。)每个视图都给模板传入了三个相同的变量:app、user和ip_address。 如果我们把这些冗余去掉会不会更好?创建 RequestContext 和 context处理器 就是为了解决这个问题。 Context处理器允许你设置一些变量,它们会在每个context中自动被设置好,而不必每次调用 render_to_response() 时都指定。 要点就是,当你渲染模板时,你要用 RequestContext 而不是 Context 。最直接的做法是用context处理器来创建一些处理器并传递给 RequestContext 。上面的例子可以用contextprocessors改写如下:from django.template import loader, RequestContextdef custom_proc(request):"A context processor that provides 'app', 'user' and 'ip_address'."return {'app': 'My app','user': request.user,'ip_address': request.META['REMOTE_ADDR']}def view_1(request):# ...t = loader.get_template('template1.html')c = RequestContext(request, {'message': 'I am view 1.'},processors=[custom_proc])return t.render(c)def view_2(request):# ...t = loader.get_template('template2.html')c = RequestContext(request, {'message': 'I am the second view.'},processors=[custom_proc])return t.render(c)首先,我们定义一个函数 custom_proc 。这是一个context处理器,它接收一个 HttpRequest 对象,然后返回一个字典,这个字典中包含了可以在模板context中使用的变量。 它就做了这么多。我们在这两个视图函数中用 RequestContext 代替了 Context 。在context对象的构建上有两个不同点。一, RequestContext 的第一个参数需要传递一个 HttpRequest 对象,就是传递给视图函数的第一个参数( request )。二, RequestContext 有一个可选的参数 processors ,这是一个包含context处理器函数的列表或者元组。 在这里,我们传递了我们之前定义的处理器函数 curstom_proc 。每个视图的context结构里不再包含 app 、 user 、 ip_address 等变量,因为这些由 custom_proc 函数提供了。每个视图 仍然 具有很大的灵活性,可以引入我们需要的任何模板变量。 在这个例子中, message 模板变量在每个视图中都不一样。

原创粉丝点击