对CBV视图的探究(1)数据显示视图

CBV

Class Base Views
视图类通过定义和声明类的的形式实现的,根据用途分成三部分,数据显示视图,数据操作视图,日期筛选视图。

数据显示视图

数据显示视图是将后台的数据展示在网页上,数据主要来自四个模型,一共定义了4个视图类。

RedirectView:用于实现HTTP重定向,默认情况下只定义get请求

视图类RedirectView用于实现HTTP重定向功能,即网页跳转功能,在Django 源码里可以看到视图类RedirectView的定义过程。

class RedirectView(View):
    """Provide a redirect on any GET request."""
    permanent = False
    url = None
    pattern_name = None
    query_string = False

    def get_redirect_url(self, *args, **kwargs):
        """
        Return the URL redirect to. Keyword arguments from the URL pattern
        match generating the redirect request are provided as kwargs to this
        method.
        """
        if self.url:
            url = self.url % kwargs
        elif self.pattern_name:
            url = reverse(self.pattern_name, args=args, kwargs=kwargs)
        else:
            return None

        args = self.request.META.get('QUERY_STRING', '')
        if args and self.query_string:
            url = "%s?%s" % (url, args)
        return url

    def get(self, request, *args, **kwargs):
        url = self.get_redirect_url(*args, **kwargs)
        if url:
            if self.permanent:
                return HttpResponsePermanentRedirect(url)
            else:
                return HttpResponseRedirect(url)
        else:
            logger.warning(
                'Gone: %s', request.path,
                extra={'status_code': 410, 'request': request}
            )
            return HttpResponseGone()

    def head(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

    def options(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

    def patch(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

在视图RedirectView定义了4个属性和八个类方法

  • permanent:根据属性值的真假来选择重定向方式,若为True,则HTTP状态码为302,否则HTTP状态码为301。
  • url:代表重定向的路由地址。
  • pattern_name:代表重定向的路由命名。如果已设置参数url,则无须设置该参数,否则提升异常信息。
  • query_string:是否将当前路由地址的请求参数传递到重定向的路由地址。
  • get_redirect_url():根据属性pattern_name所指向的路由命名来生成响应的路由地址。
  • get():触发HTTP的GET请求所执行的响应处理。

剩余的类方法head(),post()等方法都HTTP的不同请求方式,都由get方法完成响应处理。
当我们的需求比较复杂时,我们可以通过重写RedirectView来满足自己复杂的需求。

基础视图TemplateView

视图类TemplateView是所有基类最基础的应用类,开发者可以直接使用应用视图,它继承多个视图类,TemplateResponseMixin,ContextMixin和View。在Pycharn里看视图类TemplateView的源码。

lass 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)

之定义了get方法,get方法又调用了get_context_data()和render_to_response()从而完成HTTP请求的响应过程。类方法get()所调用的函数方法来自父类TemplateResonseMixin和ContextMixin。

列表视图ListView

列表视图ListView的基层类是由TemplateResponseMixin、ContexMixin和View组成的,在这些基层类的基础上加入了模型的操作方法,

  • all_empty:在模型查询数据不存在的情况下是否显示页面,若为False并且数据不存在时,则引发404异常,默认值为True。
  • queryset:代表模型的查询对象,这是对模型对象进行查询操作所形成的查询对象。
  • model:代表模型,模型以类表示,一个模型代表一张数据表
  • paginte_by:代表每一页所显示的数据量。
  • paginte_orphans:为防止最后一页数据过少可以设置包含的溢出数量。
  • ordering:主要对属性queryset的查询结果进行排序。

你可能感兴趣的:(Django,python,django,后端)