Interview question
How do you use get_object_or_404() and get_list_or_404() in Django views? Django views में get_object_or_404() और get_list_or_404() कैसे use करें?
Answer
These shortcut functions fetch an object or list, automatically raising an Http404 exception (rendering a 404 page) instead of an unhandled DoesNotExist exception when nothing matches.
from django.shortcuts import get_object_or_404, get_list_or_404, render
# WITHOUT the shortcut - manual exception handling
def book_detail_manual(request, pk):
try:
book = Book.objects.get(pk=pk)
except Book.DoesNotExist:
from django.http import Http404
raise Http404('Book does not exist')
return render(request, 'book_detail.html', {'book': book})
# WITH get_object_or_404() - one line, same behavior
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk) # raises Http404 automatically if not found
return render(request, 'book_detail.html', {'book': book})
# Can also filter with multiple conditions, like .get()
def available_book_detail(request, pk):
book = get_object_or_404(Book, pk=pk, available=True)
return render(request, 'book_detail.html', {'book': book})
# Works with a QuerySet too, not just a Model class
def my_book_detail(request, pk):
book = get_object_or_404(request.user.books.all(), pk=pk)
return render(request, 'book_detail.html', {'book': book})
# get_list_or_404() - for lists, raises Http404 if the result is EMPTY
def author_books(request, author_id):
books = get_list_or_404(Book, author_id=author_id)
# unlike .filter() which returns an empty list silently,
# this raises Http404 if the author has zero books
return render(request, 'author_books.html', {'books': books})
# What the resulting 404 page looks like:
# In DEBUG=True: a detailed Django debug 404 page
# In DEBUG=False: your custom templates/404.html templateये shortcut functions object/list fetch करते हैं, कुछ न मिलने पर unhandled DoesNotExist exception की बजाय automatically Http404 exception raise करते हैं (404 page render होता है)।
from django.shortcuts import get_object_or_404, get_list_or_404, render
# Shortcut के बिना - manual exception handling
def book_detail_manual(request, pk):
try:
book = Book.objects.get(pk=pk)
except Book.DoesNotExist:
from django.http import Http404
raise Http404('Book मौजूद नहीं')
return render(request, 'book_detail.html', {'book': book})
# get_object_or_404() के साथ - एक line
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, 'book_detail.html', {'book': book})
def available_book_detail(request, pk):
book = get_object_or_404(Book, pk=pk, available=True)
return render(request, 'book_detail.html', {'book': book})
def my_book_detail(request, pk):
book = get_object_or_404(request.user.books.all(), pk=pk)
return render(request, 'book_detail.html', {'book': book})
# get_list_or_404() - list खाली होने पर Http404
def author_books(request, author_id):
books = get_list_or_404(Book, author_id=author_id)
return render(request, 'author_books.html', {'books': books})Was this answer clear?