Django中Mixin和View组合技巧

Mixin和View的职能区分为:Mixin提供数据,View提供模板和渲染。所以一般get_context_data在Mixin中,get(),post(),head()在View中。Mixin和View不是能随意组合的,必须要注意他们之间的方法的解析顺序,也就是MRO(method resolution order)。下面我列出一些常见的MRO,以便方便的使用组合。

ContextMixin:直接就是一个get_context_data,用于返回context数据。
View:会调用所有的get方法,post方法,具体是这些['get', 'post', 'put', 'delete', 'head', 'options', 'trace'],View中是没有返回一个response的,所以光继承View的话,必须要重写get等,以返回一个response。
TemplateResponseMixin:故名思议,这个Mixin会加入Template的基本信息,也就是template的名字。但是光有Template信息是没有用的,因为她没有跟View想联系起来,如果想要跟View联系起来的话必须想办法把render_to_response插进MRO的调用顺序,而且TemplateResponseMixin是没有context的信息的。有一个可以借鉴的方法就是TemplateView的做法:

看了上面的三个类我们基本上能有一个清晰的认识了,Django中Mixin和View把原来的试图函数中的三个东西分开了,模板(TemplateResponseMixin),上下文数据(ContextMixin),负责将这些联系起来的一个东西(View)

TemplateView:TemplateView就继承自TemplateResponseMixin,ContextMixin以及View,所以它的调用思路就很明确了,在其中定义一个get方法,然后通过get方法去将上面的三个东西联系在一起.我们可以看一下TemplateView的源代码

class TemplateView(TemplateResponseMixin, ContextMixin, View):
    """
    A view that renders a template.  This view will also pass into the context
    any keyword arguments passed by the url conf.
    """
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

简短的三行代码就把上面的最基本的三个东西都包含了进来。接下来就可以看一些稍微高级一点的Mixin了。比如说SingleObjectMixin
SingleObjectMixin是继承字ContextMixin的,也就是说他存在返回上下文数据这个东西了,然后对其进行稍微的包装,也就是说,在上下文数据中加入了object的信息。如何获取这些信息呢,当然可以通过model,manager等等方法。如何加入object的信息呢,这里使用的是get_object方法。然后根据slug_url_kwarg和pk_url_kwarg去检索数据。具体的过程可以去参考django的官方文档,我这里是直接从源代码的角度去看的。具体的就是一个filter语句。这个SingleObjectMixin目的在于限制context数据的东西。

同样大家可以根据这样的思路去解决其他的Mixin和View的问题。只要记住三个东西分家就行了,最主要的还是templateresponse和context,然后是胶水view。在实际使用的过程中可以参考下面的这张图


这张图基本上显示出了关键的一些Mixin和View,当然我们可以自己去实现一些Mixin来加入一些自己的功能,这也就是可以发挥的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值