Django templates use a simple yet powerful syntax. There are three main types of template tags:
{{ }}
, they are used to display variables passed from the view to the template.<!-- In the template -->
<p>Hello, {{ name }}!</p>
In the view, you would pass the name
variable like this:
# In the view
from django.shortcuts import render
def hello_view(request):
context = {'name': 'John'}
return render(request, 'hello.html', context)
{% %}
. They are used for logic such as loops, conditionals, and loading template libraries.<!-- Loop example -->
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{# #}
. They are used to add comments in the template that will not be rendered in the output.{# This is a comment in the template #}
Template inheritance is a key feature in Django templates. It allows you to create a base template with common elements (like headers, footers) and then extend it in child templates.
Base Template (base.html
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF - 8">
<title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
<header>
<h1>My Site</h1>
</header>
<main>
{% block content %}
<!-- Content will go here -->
{% endblock %}
</main>
<footer>
<p>© 2024 My Site</p>
</footer>
</body>
</html>
Child Template (child.html
)
{% extends 'base.html' %}
{% block title %}Child Page{% endblock %}
{% block content %}
<p>This is the content of the child page.</p>
{% endblock %}
One of the most common use cases is to display data from the database. For example, if you have a Book
model and want to display a list of books.
Model (models.py
)
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
def __str__(self):
return self.title
View (views.py
)
from django.shortcuts import render
from .models import Book
def book_list_view(request):
books = Book.objects.all()
context = {'books': books}
return render(request, 'book_list.html', context)
Template (book_list.html
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF - 8">
<title>Book List</title>
</head>
<body>
<h1>Book List</h1>
<ul>
{% for book in books %}
<li>{{ book.title }} by {{ book.author }}</li>
{% endfor %}
</ul>
</body>
</html>
Django templates can also be used to render forms.
Form (forms.py
)
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(label='Your Name', max_length=100)
email = forms.EmailField(label='Your Email')
message = forms.CharField(widget=forms.Textarea)
View (views.py
)
from django.shortcuts import render
from .forms import ContactForm
def contact_view(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
# Process the form data
pass
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})
Template (contact.html
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF - 8">
<title>Contact Us</title>
</head>
<body>
<h1>Contact Us</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
</body>
</html>
In Django templates, variables defined inside a loop or a conditional block have limited scope. For example:
{% for item in items %}
{% if forloop.first %}
<p>{{ item }} is the first item.</p>
{% with first_item=item %}
<!-- first_item is only available here -->
<p>The first item stored in a variable is {{ first_item }}.</p>
{% endwith %}
{% endif %}
{% endfor %}
<!-- first_item is not available here -->
If you get a TemplateDoesNotExist
error, it could be due to incorrect template directory settings in your settings.py
file or incorrect template names in your views. Make sure your TEMPLATES
setting in settings.py
is configured correctly:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
# Other settings...
},
]
Avoid putting too much logic in templates. Templates should mainly be used for presentation. Complex calculations and data manipulation should be done in views or models.
Use template inheritance to reduce code duplication. Create a base template with common elements and then extend it for different pages.
Django allows you to create custom template tags and filters. This can make your templates more readable and reusable. For example, you can create a custom filter to format dates in a specific way.
# custom_filters.py
from django import template
register = template.Library()
@register.filter
def custom_date_format(value):
return value.strftime('%d %B %Y')
<!-- In the template -->
{% load custom_filters %}
<p>The date is {{ my_date|custom_date_format }}</p>
Django templates are a powerful tool for generating HTML output in Django applications. By understanding the core concepts, typical usage scenarios, common pitfalls, and best practices, you can use them more effectively in your real - world projects. Remember to keep your templates simple, use inheritance, and take advantage of custom tags and filters to make your code more maintainable and readable.