django: ListView解读
[转载注明出处: 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解读的更多相关文章
- django ListView
context_object_name = 'posts'. The template default name is ListView 'object_list' from .models impo ...
- Django ListView DetailView等基于类的视图如何添加装饰器?
场景: Django开发中,如果我们使用了类视图,如:ListView.DetailView.UpdateView等,这时我们又想要对这个视图添加一个装饰器,来实现某种功能,这时候该怎么处理呢? 环境 ...
- Python 小试牛刀,Django详细解读,让你更快的掌握它!!!
一.MVC和MTV模式 MVC:将web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交 ...
- Django ListView实现分页
效果: url.py main-urls from django.urls import path,include urlpatterns = [ path('admin/', admin.site. ...
- C# ListView解读
一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设 ...
- Django Restful Framework
你在浏览器中输入了一个地址的时候发生了什么事情? 1.HOST 2.DNS 3.HTTP/HTTPS协议 发送一个协议 4.进入了实现了WSGI协议的服务器(wsgiref uwsgi(C语言实现,多 ...
- 全面解读Python Web开发框架Django
全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...
- django generic view - ListView
ListView (带分页) 1.带分页效果的基础模板 1) view from django.views.generic.list import ListView from employ.model ...
- django通用视图之TemplateView和ListView简单介绍
django支持类视图,与此同时django为我们提供了许多非常好用的通用视图供我们使用,这其中TemplateView.ListView和DetailView是我们经常使用到的,这里就对Templa ...
随机推荐
- Redis—数据结构之sds
Redis是一个Key Value数据库.Redis有5种数据类型:字符串.列表.哈希.集合.有序集合.而字符串的底层实现方法之一就是使用sds.以下描述中请读者注意区分sds是指简单动态字符串这一数 ...
- dstat 服务器性能查看命令【转】
一. 安装和简解 # yum -y install dstat# dstat CPU状态:CPU的使用率.这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况.如果你看 ...
- JBoss6.1.0修改启动jvm内存以及修改日志级别【转】
转自 JBoss6.1.0修改启动jvm内存以及修改日志级别 - liangbinny的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/liangbinny/arti ...
- Pytorch自定义数据库
1)前言 虽然torchvision.datasets中已经封装了好多通用的数据集,但是我们在使用Pytorch做深度学习任务的时候,会面临着自定义数据库来满足自己的任务需要.如我们要训练一个人脸关键 ...
- 序列化 json和pickle
序列化 1. 什么叫序列化 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 2. json dumps loads 一般对字典和列表序列化 dump load 一般对 ...
- 高版本SQL备份在低版本SQL还原问题
问题描述: 高版本SQL备份在低版本SQL还原问题(出现媒体簇的结构不正确) 分析原因: SQL版本兼容问题,SQL SERVER兼容级别是用作向下兼容用,高版本的SQL备份在低版本中不兼容 ...
- Kafka ACL使用实战(单机版)
一.简介 自0.9.0.0.版本引入Security之后,Kafka一直在完善security的功能.当前Kafka security主要包含3大功能:认证(authentication).信道加密( ...
- MySQL 连接本地数据库、远程数据库命令
一.MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) C:/>mysql -h localhost -u root -p123 二. ...
- 20155225 2016-2017-2 《Java程序设计》第六周学习总结
20155225 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 java的输入输出系统 在重新指定标准输入输出时不同: 重新指定标准输入为文档输入时,是这样 ...
- Ninject中调用webapi卡住的情况解决
过年这两天在家做项目,把mvc升级到了5.1,webapi升级到了2.1,忽然发现一个问题,在某些页面上ajax调用webapi时会发现卡死现象,CPU也没有被占用,就是网页一些在加载也不报错,经过2 ...