Django中Mixin和View组合技巧

来源:互联网 发布:程序员薪资城市排行榜 编辑:程序博客网 时间:2024/05/22 03:53

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的源代码

[python] view plain copy
  1. class TemplateView(TemplateResponseMixin, ContextMixin, View):  
  2.     """ 
  3.     A view that renders a template.  This view will also pass into the context 
  4.     any keyword arguments passed by the url conf. 
  5.     """  
  6.     def get(self, request, *args, **kwargs):  
  7.         context = self.get_context_data(**kwargs)  
  8.         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来加入一些自己的功能,这也就是可以发挥的地方。