Python中Django function-based views 和 class-based views 两种 View 的优缺点及使用场景?
- 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
优势在于:
- 内置通用视图(CreateView、ListView等)直接处理CRUD
- 通过Mixin组合功能(如LoginRequiredMixin)
- HTTP方法自动分发(get()、post()方法分开)
- 更好的代码复用和扩展性
选择建议:简单逻辑用FBV,复杂业务或需要复用用CBV。
我用 function-based views 更多一些。
大多情况下 function-based views 数据流更清晰一些。
不过 function-based views 的扩展性比较差,写通用的 views 会有些困难。
就上面的场景来说,我觉得都可以,主要看习惯。

