- 在看Django RequestContext和Context处理器
- 你需要一段context来解析模板。 一般情况下,这是一个 django.template.Context 的实例,不过在Django中
- 还可以用一个特殊的子类, django.template.RequestContext ,这个用起来稍微有些不同。 RequestContext
- 默认地在模板context中加入了一些变量,如 HttpRequest 对象或当前登录用户的相关信息。
- 当你不想在一系例模板中都明确指定一些相同的变量时,你应该使用 RequestContext 。 例如,考虑这两个视
- 图:
- from django.template import loader, Context
- def 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 。上面的例子可以用context
- processors改写如下:
- from django.template import loader, RequestContext
- def 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 模板变
- 量在每个视图中都不一样。
Django Context小解
最新推荐文章于 2023-09-22 22:38:53 发布