基于类的视图与基于函数的视图

在创建 django 应用程序时,我总是使用 FBVs (基于功能的视图) ,因为它非常容易处理。但是大多数开发人员说,如果 CBV 实现起来很麻烦,那么最好使用 CBV (基于类的视图) ,并且只使用 FBV。

为什么? 使用 CBV 有什么好处?

37396 次浏览

The single most significant advantage is inheritance. On a large project it's likely that you will have lots of similar views. Rather than write the same code again and again, you can simply have your views inherit from a base view.

Also django ships with a collection of generic view classes that can be used to do some of the most common tasks. For example the DetailView class is used to pass a single object from one of your models, render it with a template and return the http response. You can plug it straight into your url conf..

url(r'^author/(?P<pk>\d+)/$', DetailView.as_view(model=Author)),

Or you could extend it with custom functionality

class SpecialDetailView(DetailView):
model = Author
def get_context_data(self, *args, **kwargs):
context = super(SpecialDetailView, self).get_context_data(*args, **kwargs)
context['books'] = Book.objects.filter(popular=True)
return context

Now your template will be passed a collection of book objects for rendering.

A nice place to start with this is having a good read of the docs (Django 4.0+).

Update

ccbv.co.uk has comprehensive and easy to use information about the class based views you already have available to you.

SOME WORDS FROM TWO SCOOPS

Tip Alternative Apporach - Staying With FBVs

Some developer prefer to err on the side of using FBVs for most views and CBVs only for views that need to be subclassed. That strategy is fine as well.

When I started with DJango I never used CBVs because of their learning curve and a bit complex structure. Fast forward over two years, I use FBVs only at few places. Where I am sure the code will be really simple and is going to stay simple.

Major benefit of CBVs and Multiple Inheritence that comes along with them is that I can completely avoid writing signals, helper methods and copy paste code. Especially in the cases where the app does much more than basic CRUD operations. Views with multiple inheritance are multiple times easier to debug that a code with signals and helper methods, especially if it is an unknown code base.

Apart from Multiple inheritence CBVs by provide different methods to do dispatching, retrieving templates, handling different request types, passing template context variables, validating forms, and much more out of the box. These make code modular and hence maintainable.

Class based views are excellent if you want to implement a fully functional CRUD operations in your Django application, and the same will take little time & effort to implement using function based views.

I will recommend you to use function based views when you are not going to implement any CRUD on your site/application means your intension is to simply render the template.

I had created a simple CRUD based application using class based views which is live. Visit http://filtron.pythonanywhere.com/view/ (will/won't be working now) and enjoy. Then you will know the importance of it.

Some views are best implemented as CBVs, and others are best implemented as FBVs.

If you aren’t sure which method to choose, see the following chart:

enter image description here

I have been using FBVs in most of the cases where I do not see a real opportunity of extending views. As documented in the docs, I consider going for CBVs if the following two characteristics suit my use-case.

  • Organization of code related to specific HTTP methods (GET, POST, etc.) can be addressed by separate methods instead of conditional branching.
  • Object oriented techniques such as mixins (multiple inheritance) can be used to factor code into reusable components.

Function-Based Views(FBVs) are:

  • Easy to use but the
  • Code is not reusable by inheritance.
  • Recommended to use

Class-Based Views(CBVs) are:

  • Too much learning curve because it's really complicated
  • Code is reusable by inheritance.
  • Not recommended to use (FBVs are much beter)