Python Tutorial
Django 404 Template
When a URL or object does not exist, return a friendly page instead of a stack trace. Django looks for 404.html at the project template root.
DEBUG Must Be Off to See It
With DEBUG = True, Django shows a yellow technical 404. To preview your template locally, set DEBUG = False and add:
# mysite/settings.py
ALLOWED_HOSTS = ["127.0.0.1", "localhost"]Turn DEBUG back on while you keep developing.
Project Templates Folder
Create mysite/templates/404.html and point DIRS at it:
# mysite/settings.py (inside TEMPLATES[0])
"DIRS": [BASE_DIR / "mysite" / "templates"],Or put templates at the project root: BASE_DIR / "templates". Then add 404.html:
<!DOCTYPE html>
<html>
<body>
<h1>Page not found</h1>
<p>We could not find that page.</p>
<p><a href="/members/">Back to members</a></p>
</body>
</html>Raise 404 From a View
from django.http import Http404
from django.shortcuts import get_object_or_404, render
from .models import Member
def details(request, id):
member = get_object_or_404(Member, id=id)
return render(request, "members/details.html", {"member": member})
# same idea without the shortcut:
def details_manual(request, id):
try:
member = Member.objects.get(id=id)
except Member.DoesNotExist:
raise Http404("Member not found")
return render(request, "members/details.html", {"member": member})📘 Real-World Deep Dive
Knowing <strong>Django 404 (Django)</strong> well is what turns Django from a curiosity into a daily tool — you'll reach for it in nearly every real project.
Real-Life Scenario
An end-to-end usage of Django 404 that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
# views.py — custom 404
from django.http import HttpResponseNotFound
def page_not_found(request, exception):
return HttpResponseNotFound("<h1>Not found</h1>")Expected Output
(no output)Common mistakes
- Forgetting to call
.save()on a model instance after mutation silently persists nothing. - Reading every row with
Model.objects.all()on a 1 M-row table OOMs the worker — use.iterator()for streaming. - Queries inside loops produce N+1 problems — pull related rows with
select_related/prefetch_related. - Treating Django 404 as a black box without reading the docs — the API has subtle defaults that bite when you scale.
🚀 Performance & Best Practices
- Add database indexes (
db_index=TrueorMeta.indexes) on columns used infilter. - Use
cache_pageon read-heavy views and setCONN_MAX_AGEto keep DB connections warm. - Generate migrations with
python manage.py makemigrations --dry-run --verbosity 3and review before committing. - When working with Django, prefer vectorised / batched operations over Python loops.
🧪 Try It Yourself
- Reproduce the snippet on a representative slice of your own data.
- Profile the snippet with
cProfileortimeitand find the single biggest improvement. - Generalise the snippet into a small, reusable function you can drop into future projects.