Python中Django function-based views 和 class-based views 两种 View 的优缺点及使用场景?

  1. function-based views (FBVs)
    def sprinkle_list(request):
    ____request = check_sprinkles(request)
    ________return render(request, “sprinkles/sprinkle_list.html”, {“sprinkles”: Sprinkle.objects.all()})

    2. class-based views (CBVs)
    class SprinkleDetail(DetailView):
    ____model = Sprinkle
    ____def dispatch(self, request, *args, **kwargs):
    ________request = check_sprinkles(request)
    ________return super(SprinkleDetail, self).dispatch(request, *args, **kwargs)

    缩进表示不出来。。。用下划线替代了。。
    Python中Django function-based views 和 class-based views 两种 View 的优缺点及使用场景?

2 回复

Django里FBV和CBV两种写法,核心区别在于组织代码的方式不同。

FBV(函数视图) 就是普通函数,接收request返回response。优点是直观简单,特别适合小型操作:

def my_view(request):
    if request.method == 'GET':
        # 处理GET逻辑
        return HttpResponse('GET response')
    elif request.method == 'POST':
        # 处理POST逻辑  
        return HttpResponse('POST response')

适合:简单端点、快速原型、不需要复用逻辑的情况。

CBV(类视图) 通过类继承实现,利用Mixin和内置类减少重复代码:

from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'About Page'
        return context

优势在于:

  1. 内置通用视图(CreateView、ListView等)直接处理CRUD
  2. 通过Mixin组合功能(如LoginRequiredMixin)
  3. HTTP方法自动分发(get()、post()方法分开)
  4. 更好的代码复用和扩展性

选择建议:简单逻辑用FBV,复杂业务或需要复用用CBV。


我用 function-based views 更多一些。
大多情况下 function-based views 数据流更清晰一些。
不过 function-based views 的扩展性比较差,写通用的 views 会有些困难。

就上面的场景来说,我觉得都可以,主要看习惯。

回到顶部