深入理解Class-based View

  • Django中,对那些我们平时经常用的View进行了封装,比如用于渲染一个template的TemplateView,用于处理重定向的RedirectView,用于处理表单的FormView,用于处理数据库对象的DetailView和ListView等,这些View有一个共同的父类:View,在这个View类中,向外暴露了一个类方法:as_view(),它返回一个方法,这就是所有的View类的入口,这也和view是一个方法的说法不违背了。

TemplateView

分析代码

深入理解Class-based View_第1张图片

  • View类提供了as_view()类方法,注意,这个方法只能当作类方法使用,不能用在实例上,它返回一个内方法view(),在这个方法中,做的事情就是dispatch的事情,根据请求的方法,调用相应的方法去处理请求,如果你发送了一个GET请求,那么在view()方法中就会分发到get()方法中去处理。View类就主要封装了这个功能,这个功能是最高层的抽象,所有的view都需要有这个特性。
  • ContextMixin类则只是实现了一个方法,get_context_data(),这是为在渲染template的时候,提供了一个默认的context,一般子类都会重写这个方法的。
  • TemplateResponseMixin类,就是真正干事的类了,它在render_to_response()方法中,返回一个TemplateResponse对象,template用的就是类属性template_name指定的。
class TemplateView(TemplateResponseMixin, ContextMixin, View):
    """
    Render a template. Pass keyword arguments from the URLconf to the context.
    """
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)
  • TemplateView继承上面的三个类,实现了get()方法,组织了一下父类中的方法,得到context,然后传给render_to_response()去构造TemplateResponse对象,渲染模板,返回,就完事了。

使用

  • 使用Class-based View有两种方法,一个是在as_view()中直接传入参数,它会覆盖掉该View原有的属性,这种情况只适用于处理不复杂的情况:
from django.conf.urls import patterns
from django.views.generic import TemplateView
 
urlpatterns = patterns('',
    (r'^about/', TemplateView.as_view(template_name="about.html")),
)
  • 另外一个就是直接继承该View,然后覆盖其中的方法,属性等,实现自己想要的功能,在URLconf中,直接使用as_view()就可以了,不用传递参数:
from django.views.generic import TemplateView
 
class AboutView(TemplateView):
    template_name = "about.html"
from django.conf.urls import patterns
from some_app.views import AboutView
 
urlpatterns = patterns('',
    (r'^about/', AboutView.as_view()),
)

ListView and DetailView

  • ListView和DetailView可以放到一起来说,这两个View类实现的非常的相似,下面两个类图,分别是ListView和DetailView的类图,从类图上看,就可以知道它们是多么的像,所不同的就只是把获取一个对象列表的函数,换成了获取一个对象的函数,大同小异。我对这些View类灵活的运用,就必须清楚它的内部结构,才能知道怎么去实现自定制。

转载自这里

你可能感兴趣的:(Django)