FBV :
```python
def add_class(request):
if request.method == "POST":
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")
return render(request, "add_class.html")
```
CBV版本:
```python
from django.views import View
class AddClass(View):
def get(self, request):
return render(request, "add_class.html")
def post(self, request):
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")
```
注意:
```python
# urls.py中
url(r'^add_class/$', views.AddClass.as_view()),
```
as_view()的流程
1. 项目运行时加载urls.py的文件,执行类as_view文件。
2. as_view()执行侯,内部定义了一个view函数,并且返回。
3. 请求到来的时候,执行view函数。
1. 实例化类——》self
2. self.resquest = request
3. 执行self.dispatch的方法
1. 判断请求方式是否被允许,
1.允许:
通过反射获取请求的方式对应的方法——》handler
获取不到。self.http_method_not_allowed
2.不允许
2. 执行handler,返回结果。
CBV加装饰器:
第一种:需要使用一个装饰器。
```python
@method_decorator('函数名')
def get(self,request):
```
第二种:加在dispatch方法上
```python
@method_decorator('函数名')
def dispatch(self,request,*args,**kwargs):
ret = super().dispath(request,*agrs,**kwargs)
return ret3
```
第三种:加在类上。
```python
@method_decorator('函数名',name='类名')
@method_decorator('函数名',name='类名')
```