Add and Register templates in Django
Setting Up Template Directories
First, you need to define where Django should look for templates. You can set this up in your settings file (settings.py).
- Template Directory: By default, Django looks for a
templatesfolder in each app directory. You can also set up a global templates directory by adding it to theDIRSoption in theTEMPLATESconfiguration insettings.py. Here’s an example:TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # Path to global templates 'APP_DIRS': True, 'OPTIONS': { # ... some options here ... }, }, ]In this configuration,
BASE_DIR / 'templates'refers to a templates directory at the root of your project.
Creating Templates
Create HTML template files in the appropriate templates folder. If you’re using app-specific templates, it’s a good practice to create a subdirectory within the templates folder that matches the name of your app to avoid naming collisions between apps.
For example, if you have an app named blog, your directory structure might look like this:
blog/ │ ├── templates/ │ └── blog/ │ └── post_detail.html
Using Templates in Views
To use a template in a view, you need to load it and render it with a context. Here’s a basic example of how to do this in a view function:
from django.shortcuts import render
def post_detail(request):
context = {'post': Post.objects.get(id=1)}
return render(request, 'blog/post_detail.html', context)
In this example, post_detail.html will be loaded from the blog/templates/blog/ directory, and the post object will be passed to it.
Use render_to_string
The render_to_string function in Django is very useful for rendering a template into a string. It’s often used when you need the rendered output of a template but don’t want to return an HTTP response directly, such as when sending emails or generating PDF files from HTML. Here’s a basic example to illustrate how to use render_to_string:
from django.template.loader import render_to_string
def send_welcome_email(user):
# Context to pass to the template
context = {'user': user}
# Render the template into a string
email_html_message = render_to_string('users/welcome_email.html', context)
# Send the email using Django's email functionality (assuming configuration is set)
send_mail(
'Welcome to Our Site!',
strip_tags(email_html_message), # Optional: plain text content
'from@example.com', # From email
[user.email], # To email list
html_message=email_html_message, # HTML content
)