文章对应的B站视频:https://www.bilibili.com/video/BV1Tu41127Ca/

Django系列文章对应的目录:https://www.cnblogs.com/emanlee/p/15860241.html

 

FBV(function base views) 基于函数的视图,就是在视图里使用函数处理请求。

CBV(class base views) 基于类的视图,就是在视图里使用类处理请求。

FBV

基于函数的视图其实我们前面章节一直在使用,就是使用了函数来处理用户的请求,查看以下实例:

路由配置:

urls.py 文件

urlpatterns = [

path("login/", views.login),

]

views.py 文件

from django.shortcuts import render,HttpResponse

def login(request):

if request.method == "GET":

return HttpResponse("GET 方法")

if request.method == "POST":

user = request.POST.get("user")

pwd = request.POST.get("pwd")

if user == "admin" and pwd == "123456":

return HttpResponse("POST 方法")

else:

return HttpResponse("POST 方法1")

 

如果我们在浏览器中直接访问 http://127.0.0.1:8000/login/ ,输出结果为:

GET 方法

CBV

基于类的视图,就是使用了类来处理用户的请求,不同的请求我们可以在类中使用不同方法来处理,这样大大的提高了代码的可读性。

定义的类要继承父类 View,所以需要先引入库:

from django.views import View

执行对应请求的方法前会优先执行 dispatch 方法(在get/post/put...方法前执行),dispatch() 方法会根据请求的不同调用相应的方法来处理。

其实,在我们前面学到的知识都知道 Django 的 url 是将一个请求分配给可调用的函数的,而不是一个类,那是如何实现基于类的视图的呢? 主要还是通过父类 View 提供的一个静态方法 as_view() ,as_view 方法是基于类的外部接口, 他返回一个视图函数,调用后请求会传递给 dispatch 方法,dispatch 方法再根据不同请求来处理不同的方法。

路由配置:

urls.py 文件

urlpatterns = [

path("login/", views.Login.as_view()),

]

 

views.py 文件

from django.shortcuts import render,HttpResponse

from django.views import View

class Login(View):

def get(self,request):

return HttpResponse("GET 方法")

def post(self,request):

user = request.POST.get("user")

pwd = request.POST.get("pwd")

if user == "admin" and pwd == "123456":

return HttpResponse("POST 方法")

else:

return HttpResponse("POST 方法 1")

 如果我们在浏览器中直接访问 http://127.0.0.1:8000/login/ ,输出结果为:GET 方法 TemplateView , ListView ,DetailViewTemplateView,这个类视图是专门用来返回模版的。在这个类中,有两个属性是经常需要用到的,一个是template_name,这个属性是用来存储模版的路径,TemplateView会自动的渲染这个变量指向的模版。另外一个是get_context_data,这个方法是用来返回上下文数据的,也就是在给模版传的参数的。

 

https://www.runoob.com/django/django-views-fbv-cbv.htmlhttps://blog.csdn.net/weixin_33742618/article/details/93227297

 

 

查看原文