[转载注明出处: http://www.cnblogs.com/yukityan/p/8039041.html ]

django内置列表视图:

# 导入
from django.views.generic import ListView # ListView继承的模块
class ListView(MultipleObjectTemplateResponseMixin, BaseListView):
pass # BaseListView继承的模块
class BaseListView(MultipleObjectMixin, View):
"""
定义了get()方法,提供给View中的dispatch方法予以调度
"""
def get():
pass
# MultipleObjectMixin继承的模块
class MultipleObjectMixin(ContextMixin):
"""
定义了与queryset相关的一些方法,以及一些自身属性,提供多种途径获取queryset以及完成分页功能
"""
pass

响应入口:
  1.首先在url配置中,我们调用django基础View视图的as_view()

    def __init__(self, **kwargs):
"""
Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
"""
# Go through keyword arguments, and either save their values to our
# instance, or raise an error.
for key, value in six.iteritems(kwargs):
setattr(self, key, value)

    

     @classonlymethod # 装饰器,根据源码注释,点明这是一个属于类的方法,实例基于类生成的实例没有不能调用
def as_view(cls, **initkwargs):
"""
Main entry point for a request-response process.
"""
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class." % (cls.__name__, key)) def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs # take name and docstring from class
update_wrapper(view, cls, updated=()) # and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
return view

  在url配置里面,我们配置的LIstView.as_view(),在项目启动时django就会自动运行as_view()方法,注意我们这里配置的是as_view(),而不是像函数视图一样的xxxview,这里的as_view完成的是类似于装饰器的用法,as_view()>return view:返回的是一个函数对象,然后再as_view()用到了装饰器:classonlymethod,说明这是一个属于类的方法,类生产的实例是没有办法调用的.as_view()对于接收的参数进行检查,所以在as_view(x='x', xx ='xx', xxx='xxx')是接收的参数名不能够与http_method_names中的http响应方法冲突且只能够是类拥有的属性.这里的意义在于,像我们使用ListView时,我们可以在views.py中编写一个类继承ListView,然后在书写类代码的时候,在其中定义我们的类属性,但是当我们两个视图功能相近时,我们完全可以调用在url中调用同一个类的as_view()方法,然后在参数中设置其属性值,比如最简单的显示两个不同model的queryset,我们在as_view()的参数传递中url(xxx, as_view(model=model1), xxx),url(xxxx,as_view(model=model2), xxxx ).

  然后函数view完成的是:当request传递进来时实例化这个类(17行)self = cls(**initkwargs),然后调用实例的dispatch方法,再调用相应的http_method处理request请求.这也就是为什么当我们继承了django中的django.view.generic.base.View时需要我们自己写get方法或者post方法了.在而BaseListView中,django已经写好了对应的get方法.

class BaseListView(MultipleObjectMixin, View):
"""
A base view for displaying a list of objects.
"""
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
allow_empty = self.get_allow_empty() if not allow_empty:
# When pagination is enabled and object_list is a queryset,
# it's better to do a cheap query than to load the unpaginated
# queryset in memory.
if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'):
is_empty = not self.object_list.exists()
else:
is_empty = len(self.object_list) == 0
if is_empty:
raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {
'class_name': self.__class__.__name__,
})
context = self.get_context_data()
return self.render_to_response(context)

然后在BaseListView.get方法中,就是类似与我们自己编写的函数视图流程,而且因为继承了MultipleObjectMixin这个类,这个类里面定义了像

class MultipleObjectMixin(ContextMixin):
"""
A mixin for views manipulating multiple objects.
"""
allow_empty = True
queryset = None
model = None
paginate_by = None
paginate_orphans = 0
context_object_name = None
paginator_class = Paginator
page_kwarg = 'page'
ordering = None
pass

等等一些属性和方法,使得在as_view()中我们就可以直接传递不同参数来配置不同的视图,而不用重新编写一个类了.所以这里最重要的是了解类的继承机制,同时了解django分发流程,通过一类编写一类视图让开发过程更加方便.

项目启动(as_view())>request请求(as_view函数中返回的view函数对象)>实例的dispatch方法>实例相对应的http_method

参数传递

as_view(xxx='xxx')(设置类属性),

view(request, *args, **kwargs)接收request,和url里面正则的捕获参数

dispatch接收request,和url里面正则的捕获参数,

http_method接收request,和url里面正则的捕获参数

django: ListView解读的更多相关文章

  1. django ListView

    context_object_name = 'posts'. The template default name is ListView 'object_list' from .models impo ...

  2. Django ListView DetailView等基于类的视图如何添加装饰器?

    场景: Django开发中,如果我们使用了类视图,如:ListView.DetailView.UpdateView等,这时我们又想要对这个视图添加一个装饰器,来实现某种功能,这时候该怎么处理呢? 环境 ...

  3. Python 小试牛刀,Django详细解读,让你更快的掌握它!!!

    一.MVC和MTV模式 MVC:将web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交 ...

  4. Django ListView实现分页

    效果: url.py main-urls from django.urls import path,include urlpatterns = [ path('admin/', admin.site. ...

  5. C# ListView解读

    一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设 ...

  6. Django Restful Framework

    你在浏览器中输入了一个地址的时候发生了什么事情? 1.HOST 2.DNS 3.HTTP/HTTPS协议 发送一个协议 4.进入了实现了WSGI协议的服务器(wsgiref uwsgi(C语言实现,多 ...

  7. 全面解读Python Web开发框架Django

    全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...

  8. django generic view - ListView

    ListView (带分页) 1.带分页效果的基础模板 1) view from django.views.generic.list import ListView from employ.model ...

  9. django通用视图之TemplateView和ListView简单介绍

    django支持类视图,与此同时django为我们提供了许多非常好用的通用视图供我们使用,这其中TemplateView.ListView和DetailView是我们经常使用到的,这里就对Templa ...

随机推荐

  1. pom可以过滤resource 下的文件

  2. Golang新起航!(编译安装go)

    别废话,直接上~ linux下安装GO1.8 1.下载go的版本 国内地址源:https://dl.gocn.io/ 在这里选择源码的方式安装,在安装go的时候是需要gcc的,所以你的linux系统需 ...

  3. No.15 selenium for python JavaScript

    JS处理滚动条 一.上下滚动 1.滚动条回到顶部: js="var q=document.documentElement.scrollTop=10000" driver.execu ...

  4. sql中多层循环示例(有游标)

    在需求处理中,我们会遇到需要通过SQL多层循环来处理的问题.如:A表中有8条数据,B表中有10条数据,需要实现A表中的每1条数据对应B表中的10条数据,最后就有了80条数据,从而实现一对多的关系.那如 ...

  5. 在EC2上创建root用户,并使用root用户登录

    今天开始研究亚马逊的云主机EC2,遇到了一个问题,我需要在EC2上安装tomcat,但是yum命令只能是root用户才可以运行,而EC2默认是以ec2-user用户登录的,所以需要切换到root用户登 ...

  6. 浅析redux

    一 redux 思想 首先,每一个webApp有且只有一个state tree,为方便管理和跟踪state的变化,也为了减少混乱,redux只允许通过发送(dispatch)action的方式来改变s ...

  7. C++有super关键字么?

    很多人在学习Java之后,看到Java里面有super关键字,用来表示父类,那么C++里面有super关键字么? 答案是否定的.这也很容易理解,C++由于支持多继承,所以假设存在super关键字,那么 ...

  8. PostgreSQL数据库如果不存在则插入,存在则更新

    INSERT INTO UM_CUSTOMER(customercode,CompanyFlag,InputTime,LocalVersion) ) ON conflict(customercode) ...

  9. Elasticsearch介绍及安装部署

    本节内容: Elasticsearch介绍 Elasticsearch集群安装部署 Elasticsearch优化 安装插件:中文分词器ik 一.Elasticsearch介绍 Elasticsear ...

  10. activeMQ 持久化配置

    Mac 中安装activeMQ brew install activemq 启动 activemq start 控制台:在浏览器中输入url: http://localhost:8161/ A:持久化 ...