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 (

  1. Template Directory: By default, Django looks for a templates folder in each app directory. You can also set up a global templates directory by adding it to the DIRS option in the TEMPLATES configuration in Here’s an example:
            '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:

├── 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)
        'Welcome to Our Site!',
        strip_tags(email_html_message),  # Optional: plain text content
        '[email protected]',  # From email
        [],  # To email list
        html_message=email_html_message,  # HTML content