Django | 模板 自定义 context_processors

源:http://blog.sina.com.cn/s/blog_536c64470101a1h3.html

        http://segmentfault.com/blog/kycool/1190000002461627





文章1:

这个是用于:view返回到页面渲染之前增加一个处理,这个处理是为传回页面的Context增加参数。你可以为单独的view增加processor也可以为所有的view增加processor,相当于一种特殊的拦截器。

1.       建立自己的context_processors.py

def add_information(request):

return {'information': request.session.get('information', '')}

2.       settings.py里增加配置

TEMPLATE_CONTEXT_PROCESSORS = (

    'django.contrib.auth.context_processors.auth',

    #'django.core.context_processors.auth',

    'django.core.context_processors.csrf',

    "django.core.context_processors.debug", #debug for sql clause show",

    'context_processors.add_information'

)

3.       view里的Context替换成RequestContex

def agencyCustomer(request,agencyId):

    if not isCustomerAdmin(request):     

        return HttpResponseRedirect('/admin/customer/noRight/') 

    t = loader.get_template('app/agencyCustomer.html')

    items = Agency.objects.all()

    agencyCustomer = None

    customerId = None

    if 'customerId' in request.GET:

        customerId = request.GET['customerId']

        agencyCustomer = AgencyCustomer.objects.get(id=customerId)

        form = AgencyCustomerForm(initial={'cCusCode': agencyCustomer.cCusCode,'cCusName':agencyCustomer.cCusName})

    else:

        form = AgencyCustomerForm()

    c = RequestContext(request,{'agencyId':agencyId,'agencyCustomer':agencyCustomer,'items':items,'form':form,'customerId':customerId})

   

return HttpResponse(t.render(c))

4.       当然也可以这样

def ip_address_processor(request):

    return {'ip_address': request.META['REMOTE_ADDR']}

def some_view(request):

   c = RequestContext(request, {

        'foo''bar',

    }, [ip_address_processor])

    return HttpResponse(t.render(c))

为某个视图单独指定processor



文章2:

Django 版本

1.6.7

原因

因为当前模块下的所有视图都需要共同变量,就想到了利用模板系统的自定义 context_processors

目的

偷懒,降低工作量,重用

准备

模块:blog(这是我自己创建的模块)

步骤

1 自定义函数
考虑到 pythonic 原则,我把文件放到模块下,并起名为 context_processors.py
路径为 blog/context_processors.py

自定义函数(测试随写的)

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 注意:这里只有一个参数 即 HttpRequest 对象或当前用户的其他信息
def custom_proc(request):
    user = {'name': 'allen', 'sex': 'man'}
    return user
2 视图逻辑
#!/usr/bin/python
# -*- coding: UTF-8 -*-

from django.template import RequestContext
from django.shortcuts import render_to_response
import datetime

def time(request):
    current_date = datetime.datetime.now();
    return render_to_response('test.html', locals(),
                                context_instance=RequestContext(request))
3 settings.py 设置

注意:不同django版本的 TEMPLATE_CONTEXT_PROCESSORS 默认配置是不同的,请到官方文档查阅相关信息

默认情况下,配置文件中是没有 TEMPLATE_CONTEXT_PROCESSORS 配置项的,所以这里需要自己添加

配置如下:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.core.context_processors.tz',
    'django.contrib.messages.context_processors.messages',
    'blog.context_processors.custom_proc',
)
4 模板中调用
name: {{ name }}::sex {{sex}}

思考

这样让我降低了很多的工作量,但是在视图中每次都要去写 context_instance=RequestContext(request), 这对我来说是极度痛苦的,但是目前还没有找到更好的解决方法,在努力中

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值