Class Base Views
视图类通过定义和声明类的的形式实现的,根据用途分成三部分,数据显示视图,数据操作视图,日期筛选视图。
数据显示视图是将后台的数据展示在网页上,数据主要来自四个模型,一共定义了4个视图类。
视图类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个属性和八个类方法
剩余的类方法head(),post()等方法都HTTP的不同请求方式,都由get方法完成响应处理。
当我们的需求比较复杂时,我们可以通过重写RedirectView来满足自己复杂的需求。
视图类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的基层类是由TemplateResponseMixin、ContexMixin和View组成的,在这些基层类的基础上加入了模型的操作方法,