Python Tutorial
Django Template Variables
Double curly braces print a value from the view context. You can access object attributes and dictionary keys, and run filters.
Print a Variable
View:
def members(request):
context = {
"firstname": "Emil",
"member": {"lastname": "Refsnes"},
}
return render(request, "members/template.html", context)Template:
<p>Hello {{ firstname }} {{ member.lastname }}!</p>Output: Hello Emil Refsnes!
Attributes vs Keys
Django tries, in order: dictionary lookup, attribute, list index. So member.lastname works for a dict, a model instance, or an object with that attribute.
Filters
A pipe runs a filter:
{{ firstname|upper }}
{{ joined_date|date:"M d, Y" }}
{{ bio|default:"No bio yet" }}
{{ members|length }}| Filter | Effect |
|---|---|
upper / lower | Case |
date | Format a date |
default | Fallback if empty |
length | Count items |
safe | Do not escape HTML (use carefully) |
Auto-escaping
Django HTML-escapes variables so <script> in user data will not run. Only mark content safe when you generated the HTML yourself.
📘 Real-World Deep Dive
Knowing <strong>Django Variables (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 Variables that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
{# templates/welcome.html #}
<p>Welcome, {{ user.username }}!</p>
<p>You have {{ notifications.count }} notifications.</p>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 Variables 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.