本文参考于Django2.2文档
视图函数(或简称视图)只是一个Python函数,它接受Web请求并返回Web响应。该响应可以是网页的HTML内容,重定向,404错误,XML文档或图像。。。真的。视图本身包含返回该响应所需的任何任意逻辑。该代码可以存在于您想要的任何地方,只要它在Python路径上即可。可以说,没有其他要求-没有“魔术”。为了将代码放在某处,约定是将视图放在一个名为的文件中views.py,该文件位于项目或应用程序目录中。
Django有3种视图:
- 函数视图 FBV
- 类视图 CBV
- 通用视图 CBGV
函数视图 FBV
通过条件分支来处理不同http请求
# 函数视图 FBV
def my_view(request):
if request.method == 'GET':
return HttpResponse("xxx")
elif request.method == 'POST':
return HttpResponse("xxx")
elif request.method == 'DELETE':
return HttpResponse("xxx")
# urls
from . import views
urlpatterns = [
path('', views.my_view, name='index')
]
缺点:函数式编程-面向过程,代码复用率低
类视图 CBV
继承自View类,通过不同实例方法来响应http请求
# 面向对象编程
from django.views.generic import View
class MyView(View):
def get(self,request,*args,**kwargs):
pass
def post(self,request,*args,**kwargs):
pass
# urls
from . import views
# 使用as_view()方法,为基于类的视图提供一个类似函数的入口
urlpatterns = [
path('', views.MyView.as_view(), name='index')
]
通用视图 CBGV
在类视图上更进一步,把增删改查操作的具体方法抽象出来,使用更少的代码实现功能
以通用显示视图 DetailView 为例:
-
该视图从以下视图继承方法和属性,MRO顺序:
想了解MRO的具体原理移步我的另一篇博文: https://blog.csdn.net/weixin_44955304/article/details/105175789
DetailView(自身)
django.views.generic.detail.SingleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.detail.BaseDetailView
django.views.generic.detail.SingleObjectMixin
django.views.generic.base.ContextMixin
django.views.generic.base.View -
方法流程图
-
具有(可重写-自定义)的类属性
属性 Defined in content_type = None TemplateResponseMixin context_object_name = None SingleObjectMixin extra_context = None ContextMixin http_method_names = [‘get’, ‘post’, ‘put’, ‘patch’, ‘delete’, ‘head’, ‘options’, ‘trace’] View model = None SingleObjectMixin pk_url_kwarg = ‘pk’ SingleObjectMixin query_pk_and_slug = False SingleObjectMixin queryset = None SingleObjectMixin response_class = <class ‘django.template.response.TemplateResponse’> TemplateResponseMixin slug_field = ‘slug’ SingleObjectMixin slug_url_kwarg = ‘slug’ SingleObjectMixin template_engine = None