Django基础之CBV和FBV

本文对比了Django中基于函数的视图(FBV)与基于类的视图(CBV)的实现方式,详细介绍了CBV的原理及如何通过反射执行不同的请求方法。同时,提供了具体的FBV和CBV代码示例,帮助读者理解两种视图的差异。

我们之前写过的是基于函数的view,就叫FBV。还可以把view写成基于类的。

1. FBV版

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/")
    return render(request, "add_class.html")

2. CBV版

基于反射,实现根据请求方式不同,执行不同的方法。
原理:
(1)路由:url---> view函数---->dispatch方法(根据反射执行其他method方法)

from django.views import View
from django.shortcuts import render, HttpResponse, redirect
class AddName(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/")

使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等再做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。

from django.vies import View
from django.shortcuts import render, HttpResponse, redirect

class Login(View):

    def dispatch(self, request, *args, **kwargs):
        print("before")
        obj = super(Login, self).dispatch(request, *args, **kwargs)
        print("after")
        return obj

    def get(self, request):
        return render(request, "login.html")

    def post(self, request):
        print(request.POST.get("user"))
        return HttpResponse("Login.post")

注意,在使用CBV时,urls.py中也做对应的修改。

url(r"^add_class/$", views.AddClass.as_view())

转载于:https://www.cnblogs.com/yang-wei/p/9997671.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值