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的查询结果进行排序。