We choose between function-based and class-based views to organize how our web app handles requests. Each way helps us write clear and reusable code.
Function-based vs class-based decision in Django
Start learning this pattern below
Jump into concepts and practice - no test required
Function-based view: from django.http import HttpResponse def my_view(request): # handle request return HttpResponse('Hello') Class-based view: from django.http import HttpResponse from django.views import View class MyView(View): def get(self, request): # handle GET request return HttpResponse('Hello')
Function-based views are simple Python functions that take a request and return a response.
Class-based views use Python classes and methods to handle different HTTP methods like GET or POST.
from django.http import HttpResponse def hello_function(request): return HttpResponse('Hello from function!')
from django.http import HttpResponse from django.views import View class HelloClass(View): def get(self, request): return HttpResponse('Hello from class!')
from django.views.generic import ListView from .models import Item class ItemListView(ListView): model = Item template_name = 'items.html'
This example shows both a function-based and a class-based view that return simple greetings. You can use either depending on your needs.
from django.http import HttpResponse from django.views import View # Function-based view def greet_function(request): return HttpResponse('Hello from function-based view!') # Class-based view class GreetClass(View): def get(self, request): return HttpResponse('Hello from class-based view!')
Function-based views are easier to write for simple tasks.
Class-based views help organize code better for complex views and reuse.
Django provides many built-in class-based views to save time.
Function-based views are simple functions handling requests directly.
Class-based views use classes and methods to organize request handling.
Choose based on simplicity or need for reuse and organization.
Practice
Solution
Step 1: Understand CBVs and inheritance
Class-based views use classes, so they can inherit and reuse code easily.Step 2: Compare with FBVs
Function-based views are simple functions and do not support inheritance for reuse.Final Answer:
CBVs allow reuse of common functionality through inheritance. -> Option DQuick Check:
CBVs = reuse by inheritance [OK]
- Thinking CBVs are always faster
- Believing FBVs can't handle POST
- Assuming FBVs are better for complex views
Solution
Step 1: Check function signature for FBV
A function-based view must accept a request parameter.Step 2: Validate return statement
The function should return an HttpResponse object.Final Answer:
def my_view(request): return HttpResponse('Hello') -> Option AQuick Check:
FBV needs request param and returns HttpResponse [OK]
- Omitting the request parameter
- Using class syntax for FBV
- Not returning HttpResponse
from django.http import HttpResponse
from django.views import View
class HelloView(View):
def get(self, request):
return HttpResponse('Hello from CBV')Solution
Step 1: Identify the get method behavior
The get method returns HttpResponse with 'Hello from CBV'.Step 2: Understand request handling
A GET request calls the get method and returns that response content.Final Answer:
Hello from CBV -> Option BQuick Check:
GET calls get() returning 'Hello from CBV' [OK]
- Confusing class name with response content
- Thinking get method lacks request parameter
- Expecting empty or error response
def my_view():
return HttpResponse('Hi')Solution
Step 1: Check function parameters
Function-based views must accept a request parameter to receive HTTP requests.Step 2: Validate function signature
The given function lacks the required request parameter, causing errors.Final Answer:
Missing request parameter in function definition. -> Option CQuick Check:
FBV needs request param [OK]
- Ignoring missing request parameter
- Thinking HttpResponse can't be returned
- Believing function names must be capitalized
Solution
Step 1: Identify need for handling GET and POST separately
Class-based views allow defining separate get() and post() methods for clarity.Step 2: Consider code reuse
CBVs support inheritance, so common code can be reused across multiple views easily.Final Answer:
Use class-based views with methods for GET and POST and inheritance for reuse. -> Option AQuick Check:
CBVs = separate methods + reuse [OK]
- Using FBVs with complex if-else for methods
- Putting all logic in one CBV method
- Ignoring inheritance benefits
