Python Tutorial
Django Templates
Templates are HTML files that Django fills with data from the view. Move Hello world out of Python and into an HTML file.
Create the Template Folder
Django looks for templates inside each installed app at templates/appname/:
members/templates/members/myfirst.htmlCreate those folders, then add myfirst.html:
<!DOCTYPE html>
<html>
<body>
<h1>Hello World!</h1>
<p>Welcome to the members app.</p>
</body>
</html>Render It From the View
Change members/views.py:
from django.http import HttpResponse
from django.template import loader
def members(request):
template = loader.get_template("members/myfirst.html")
return HttpResponse(template.render())The shortcut most projects use is render():
from django.shortcuts import render
def members(request):
return render(request, "members/myfirst.html")Pass Data With Context
The second argument to render() is a dict. Keys become variables in the template:
def members(request):
context = {"greeting": "Welcome to the club"}
return render(request, "members/myfirst.html", context)In the HTML file (Django template language):
<h1>{{ greeting }}</h1>APP_DIRS
In settings.py, TEMPLATES has "APP_DIRS": True by default. That is why members/templates/... works without extra config. You can also add a project-wide folder in DIRS for a shared base.html.
📘 Real-World Deep Dive
Knowing <strong>Django Templates (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 Templates that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
{# templates/hello.html #}
<!doctype html>
<html><body>
<h1>Hello, {{ name|escape }}!</h1>
{% if items %}
<ul>{% for it in items %}<li>{{ it }}</li>{% endfor %}</ul>
{% endif %}
</body></html>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 Templates 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.