CBV模式即为API式的写法,一个资源类接受一系列的请求。本文讨论的是View的直接子类中的概念和方法,Django REST framework中重写和添加了大量的方法,能够直接继承自XXXAPIView,再也不本文的讨论范围。python
class HelloView(View):
def get(self, request):
return HttpResponse("GET view ok")
复制代码
View中的方法git
def get(self, request):
return HttpResponse("GET %s" % self.msg)
复制代码
def as_view(resquest):
def view(cls)
self = cls(**initkwargs)
复制代码
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
复制代码
return [m.upper() for m in self.http_method_names if hasattr(self, m)]
复制代码
as_viewgithub
经过内置方法dispatch来分发请求方法函数
重写View父类,实现继承自重写类的类,能够支持请求方法post
class HelloCustomView(object):
@classmethod
def as_view(cls):
def view(request):
self = cls()
return self.dispatch(request)
return view
def dispatch(self, request):
handler = getattr(self, request.method.lower(), None)
if not handler:
return HttpResponse("request method not allowed")
return handler(request)
def get(self, request):
return HttpResponse("GET")
def post(self, request):
return HttpResponse("POST")
def put(self, resquest):
return HttpResponse("PUT")
复制代码
继承关系如图url
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gSkf4aVq-1573007279134)(github.com/belingud/im…)]spa
有三个父类code
TemplateView实现的功能:对象
继承关系如图blog
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BIF0IjzQ-1573007279135)(github.com/belingud/im…)]
ListView只是继承父类,没有在其中增改方法
有两个父类:
MultipleObjectTemplateResponseMixin的属性和方法
属性:
方法:
BaseListView的属性和方法
无属性
方法:
return self.render_to_response(context)
复制代码
有一个父类
也是View的父类,属性和方法同上文的TemplateResponseMixin
有两个父类
他有一个父类ContextMixin,父类的类方法 get_context_data
将传入的键值对转化为’view’键字典的默认多继承父类
属性:
传入一个model或者query_set,返回modelname_list,不然默认为object_list
model = Book # 或下面的query_set
queryset = Book.objects.all()
复制代码
方法:
即上文中的View
graph LR
A[url] --> B[as_views]
B[as_views]-->C[dis_patch]
C[dis_patch]-->D[get]
D[get]-->E[get_queryset]
E[get_queryset]-->F[get_context_data]
F[get_context_data]-->G[render_to_response]
复制代码
graph TD
A[get_queryset]-->B[queryset属性和model属性]
A[get_queryset]-->C[get_ordering]
A[get_queryset]-->D[get_allow_empty]
复制代码
graph TD
A[get_context_data]-->B[get_paginate_by]
A[get_context_data]-->C[get_context_object_name]
A[get_context_data]-->D[向context中注入数据]
复制代码