LOADING

Follow me

Django Context小解
十一月 22, 2013|Whistler

Django Context小解


  1. 在看Django RequestContext和Context处理器
  2. 你需要一段context来解析模板。 一般情况下,这是一个 django.template.Context 的实例,不过在Django中
  3. 还可以用一个特殊的子类, django.template.RequestContext ,这个用起来稍微有些不同。 RequestContext
  4. 默认地在模板context中加入了一些变量,如 HttpRequest 对象或当前登录用户的相关信息。
  5. 当你不想在一系例模板中都明确指定一些相同的变量时,你应该使用 RequestContext 。 例如,考虑这两个视
  6. 图:
  7. from django.template import loader, Context
  8. def view_1(request):
  9. # …
  10. t = loader.get_template(‘template1.html’)
  11. c = Context({
  12. ‘app’: ‘My app’,
  13. ‘user’: request.user,
  14. ‘ip_address’: request.META[‘REMOTE_ADDR’],
  15. ‘message’: ‘I am view 1.’
  16. })
  17. return t.render(c)
  18. def view_2(request):
  19. # …
  20. t = loader.get_template(‘template2.html’)
  21. c = Context({
  22. ‘app’: ‘My app’,
  23. ‘user’: request.user,
  24. ‘ip_address’: request.META[‘REMOTE_ADDR’],
  25. ‘message’: ‘I am the second view.’
  26. })
  27. return t.render(c)
  28. (注意,在这些例子中,我们故意 不 使用 render_to_response() 这个快捷方法,而选择手动载入模板,手动
  29. 构造context对象然后渲染模板。 是为了能够清晰的说明所有步骤。)
  30. 每个视图都给模板传入了三个相同的变量:app、user和ip_address。 如果我们把这些冗余去掉会不会更好?
  31. 创建 RequestContext 和 context处理器 就是为了解决这个问题。 Context处理器允许你设置一些变量,它们
  32. 会在每个context中自动被设置好,而不必每次调用 render_to_response() 时都指定。 要点就是,当你渲染模
  33. 板时,你要用 RequestContext 而不是 Context 。
  34. 最直接的做法是用context处理器来创建一些处理器并传递给 RequestContext 。上面的例子可以用context
  35. processors改写如下:
  36. from django.template import loader, RequestContext
  37. def custom_proc(request):
  38. “A context processor that provides ‘app’, ‘user’ and ‘ip_address’.”
  39. return {
  40. ‘app’: ‘My app’,
  41. ‘user’: request.user,
  42. ‘ip_address’: request.META[‘REMOTE_ADDR’]
  43. }
  44. def view_1(request):
  45. # …
  46. t = loader.get_template(‘template1.html’)
  47. c = RequestContext(request, {‘message’: ‘I am view 1.’},
  48. processors=[custom_proc])
  49. return t.render(c)
  50. def view_2(request):
  51. # …
  52. t = loader.get_template(‘template2.html’)
  53. c = RequestContext(request, {‘message’: ‘I am the second view.’},
  54. processors=[custom_proc])
  55. return t.render(c)
  56. 首先,我们定义一个函数 custom_proc 。这是一个context处理器,它接收一个 HttpRequest 对象,然后
  57. 返回一个字典,这个字典中包含了可以在模板context中使用的变量。 它就做了这么多。
  58. 我们在这两个视图函数中用 RequestContext 代替了 Context 。在context对象的构建上有两个不同点。
  59. 一, RequestContext 的第一个参数需要传递一个 HttpRequest 对象,就是传递给视图函数的第一个参数
  60. ( request )。二, RequestContext 有一个可选的参数 processors ,这是一个包含context处理器函数
  61. 的列表或者元组。 在这里,我们传递了我们之前定义的处理器函数 curstom_proc 。
  62. 每个视图的context结构里不再包含 app 、 user 、 ip_address 等变量,因为这些由 custom_proc 函数提
  63. 供了。
  64. 每个视图 仍然 具有很大的灵活性,可以引入我们需要的任何模板变量。 在这个例子中, message 模板变
  65. 量在每个视图中都不一样。

版权声明:本文为博主原创文章,未经博主允许不得转载。

no comments
Share

发表评论