Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Class Based Views VS Function Based Views

I always use FBVs (Function Based Views) when creating a django app because it's very easy to handle. But most developers said that it's better to use CBVs (Class Based Views) and use only FBVs if it is complicated views that would be a pain to implement with CBVs.

Why? What are the advantages of using CBVs?

like image 739
catherine Avatar asked Feb 09 '13 12:02

catherine


People also ask

What is a class-based view?

A view is a callable which takes a request and returns a response. This can be more than just a function, and Django provides an example of some classes which can be used as views. These allow you to structure your views and reuse code by harnessing inheritance and mixins.

Is it better to use class-based views Django?

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.

What are function based views?

Function-based views are created by passing an HttpRequest object as a parameter to a Python function that produces a HttpResponse object. The HTML content of a Web page, an XML document, a redirect, a 404 error, or a picture are all examples of responses.

What is CBV and Fbv in Django?

Django has two types of views; function-based views (FBVs), and class-based views (CBVs). Django originally started out with only FBVs, but then added CBVs as a way to templatize functionality so that you didn't have to write boilerplate (i.e. the same code) code over and over again.


1 Answers

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.

like image 69
Aidan Ewen Avatar answered Oct 21 '22 09:10

Aidan Ewen