哦,上下文变量

最近项目中遇到一个问题:

有一个base.html,前台页面基本都会extends这个base.html

base.html页面内有两个变量,需要views传入。要是有个几百个继承base.html的页面,每个页面需要一个views,那得是都大的工作量。

上下文变量不错:

RequestContext 

class RequestContext(Context):
    """
    This subclass of template.Context automatically populates itself using
    the processors defined in TEMPLATE_CONTEXT_PROCESSORS.
    Additional processors can be specified as a list of callables
    using the "processors" keyword argument.
    """
    def __init__(self, request, dict_=None, processors=None, current_app=None,
            use_l10n=None, use_tz=None):
        Context.__init__(self, dict_, current_app=current_app,
                use_l10n=use_l10n, use_tz=use_tz)
        if processors is None:
            processors = ()
        else:
            processors = tuple(processors)
        for processor in get_standard_processors() + processors:
            self.update(processor(request))


RequestContext继承了Context,扩展了Context,最主要的就是红色的那两句,

get_standard_processors() 

通过查看方法可以知道是获取在settings文件中 每个要被执行的处理器函数

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.request",
    "django.core.context_processors.media",
)

一个请求进来时的过程  url 找到 对应的views, return (上下文变量就是在返回时对request做了一些事,主要就是返回一个字典,类似于return {
        'user': user,
        'perms': PermWrapper(user),
    }
然后我们在模板就是可以使用返回来的值了),

方法一:只要我们在settings中TEMPLATE_CONTEXT_PROCESSORS定义了一个处理器,那我们使用RequestContext就不需要重复定义每个页面都需要的变量了。缺点就是每个views都使用了定义的处理器,如果不想让每个views都被处理那?

方法二:如果不是很多页面公用变量,而只有一部分,只针对指定的views使用指定的处理器

return  render_to_response(template_name,extra_context,context_instance=RequestContext(request,processors=[xxxxx]))

原理就是for processor in get_standard_processors() + processors:
            self.update(processor(request))

在获取了一开始初始settings设置的processor,同时也加入了我们自定义的一个处理器,这样我们针对想要使用处理器的views单独指定。


转载于:https://my.oschina.net/012345678/blog/170351

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值