Django的Context和RequestContext

1
2
3
4
     
=  Template( 'My name is {{ name }}.' )
=  Context({ 'name' 'Stephane' })
t.render(c)

Django的模板渲染中,Context可以用来传递数据,一个Context是一系列变量和值的集合,它和Python的字典有点相似。

context在Django里表现为Context类,在django.template模块里。她的构造函数带有一个可选的参数:一个字典映射变量和它们的值。调用Template对象的render()方法并传递context来填充模板。

要注意到是:t.render(c)返回的值是一个Unicode对象,而不是普通的Python字符串。

再看下面这个视图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def  view_1(request):
     # ...
     =  loader.get_template( 'template1.html' )
     =  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):
     # ...
     =  loader.get_template( 'template2.html' )
     =  Context({
         'app' 'My app' ,
         'user' : request.user,
         'ip_address' : request.META[ 'REMOTE_ADDR' ],
         'message' 'I am the second view.'
     })
return  t.render(c)

在view_1和view_2中,每个视图都给模板传入了三个相同的变量:app、user和ip_address,这显然增加了代码的冗余度,这时RequestContext就派上用场了,它是一个Context的子类。当在一系例模板中都需要明确指定一些相同的变量时,RequestContext就可以帮你省去多次硬编码的麻烦。以上代码可以变为如下形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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):
     # ...
     =  loader.get_template( 'template1.html' )
     =  RequestContext(request, { 'message' 'I am view 1.' },
         processors = [custom_proc])
     return  t.render(c)
     
def  view_2(request):
     # ...
     =  loader.get_template( 'template2.html' )
     =  RequestContext(request, { 'message' 'I am the second view.' },
         processors = [custom_proc])
     return  t.render(c)

这是不是省事多了呢?

在settings.py中有一个与RequestContext密切相关的配置项为TEMPLATE_CONTEXT_PROCESSORS:

TEMPLATE_CONTEXT_PROCESSORS = (

   'django.core.context_processors.auth',

   'django.core.context_processors.debug',

   'django.core.context_processors.i18n',

   'django.core.context_processors.media',

)

这些Processors都会被RequestContext顺序调用,往当前Context中放入一些预定义变量。例如'django.core.context_processors.auth'作用在于默认向模板传递user、messages、perms等变量,分别描述当前登录用户、当前登录用户的消息列表和当前登录用户的权限。最后一点,当使用render_to_response方法时,RequestContext应作为其第三个参数传入,如:

1
2
3
     # ...
     return  render_to_response( 'template.html' , particular_data_dictionary,
         context_instance = RequestContext(request))

更多内容可以参考《The Django Book》(以上文章的部分内容和代码也截取自这里)或官方文档。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值