Preparing HTML Templates for Django with Python — Using Partials

1. Understand the Role of HTML Templates in Django

Django templates help in generating HTML dynamically by inserting data from views. These templates usually include standard sections such as headers, footers, and sidebars. Utilizing common sections across multiple pages ensures consistency and simplifies maintenance.

2. Create a Base Template

Start by designing a base HTML template. This template should contain common elements that are consistent throughout your site, like the header, footer, and sidebar. Here’s an example:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}My Website{% endblock %}</title>
    <link rel="stylesheet" href="{% static 'styles.css' %}">
</head>
<body>
    <header>
        <h1>My Website</h1>
        <nav>
            <ul>
                <li><a href="{% url 'home' %}">Home</a></li>
                <li><a href="{% url 'about' %}">About</a></li>
            </ul>
        </nav>
    </header>
    <div id="page-wrapper">
        <aside>
            {% include 'includes/sidebar.html' %}
        </aside>
        <main id="page-content">
            {% block content %}
            {% endblock %}
        </main>
    </div>
    <footer>
        <p>© 2024 My Website</p>
    </footer>
</body>
</html>

3. Utilize Standardized Sections in Templates

Standard sections such as headers, footers, and sidebars can be standardized across your HTML files. For instance, if your pages use a specific id for the sidebar or comments like <!-- Page content -->, you can manage these consistently using Python.

4. Extract Common Sections Using Python

Python can be employed to extract common sections from your HTML files and save them as partials. For example — if you have sidebars across different pages, you can use Python to create a sidebar partial.

Here’s a Python script to extract a sidebar from an HTML file:

from bs4 import BeautifulSoup

def extract_section(input_file, section_id, output_file):
    with open(input_file, 'r') as file:
        soup = BeautifulSoup(file, 'html.parser')

    section = soup.find(id=section_id)
    if section:
        with open(output_file, 'w') as file:
            file.write(str(section))

extract_section('index.html', 'sidebar', 'includes/sidebar.html')

Code Breakdown

4a. Import the Library

from bs4 import BeautifulSoup

This line imports the BeautifulSoup class from the bs4 module. BeautifulSoup is a library used for parsing HTML and XML documents.

4b. Define the Function

def extract_section(input_file, section_id, output_file):

This defines a function called extract_section with three parameters:

  • input_file: the path to the HTML file from which to extract the section.
  • section_id: the ID of the HTML element to be extracted.
  • output_file: the path where the extracted section will be saved.

4c. Open and Read the Input File

with open(input_file, 'r') as file:
    soup = BeautifulSoup(file, 'html.parser')

This block of code opens the specified input file in read mode. The file content is passed to BeautifulSoup, which parses the HTML content using the html.parser parser.

4d. Find the Section by ID

section = soup.find(id=section_id)

This line uses BeautifulSoup’s find method to locate the HTML element with the specified ID. The section variable will contain the element if found, or None if the element does not exist.

4e. Check if Section Exists and Save It

if section:
    with open(output_file, 'w') as file:
        file.write(str(section))

This conditional block checks if the section variable is not None (i.e., the section was found). If the section exists:

  • Opens the specified output_file in write mode.
  • Converts the BeautifulSoup object section to a string and writes it to the output file.

4f. Call the Function

extract_section('index.html', 'sidebar', 'includes/sidebar.html')

This line calls the extract_section function with specific arguments:

  • 'index.html' is the input HTML file.
  • 'sidebar' is the ID of the section to be extracted.
  • 'includes/sidebar.html' is the file where the extracted section will be saved.

5. Create Include Files

Save extracted sections such as headers, footers, and sidebars in include files. Place these files in an includes directory. Then, update your base template to use these partials:

{% include 'includes/header.html' %}
<div id="page-wrapper">
    <aside>
        {% include 'includes/sidebar.html' %}
    </aside>
    <main id="page-content">
        {% block content %}
        {% endblock %}
    </main>
</div>
{% include 'includes/footer.html' %}

6. Refactor Existing Templates

With the partials in place, refactor your existing HTML files to use the new include files. Each page should extend the base template and define its unique content. For example, home.html might look like this:

{% extends 'base.html' %}

{% block content %}
    <div id="page-content">
        <h2>Welcome to the Home Page</h2>
        <p>This is the home page content.</p>
    </div>
{% endblock %}

7. Validate and Test Your Templates

To ensure consistency and functionality, validate your templates. Verify that each page correctly extends the base template and includes the necessary partials. Use Django’s development server to preview and test your templates.

8. Automate and Optimize

Python can help automate repetitive tasks and optimize your workflow. Write scripts to manage your templates, ensuring that common sections are consistently included and blocks are properly defined. For example, use a script to check if all templates extend the base template:

import os

BASE_TEMPLATE = 'base.html'

def validate_templates(template_dir):
    for root, dirs, files in os.walk(template_dir):
        for file in files:
            if file.endswith('.html') and file != BASE_TEMPLATE:
                with open(os.path.join(root, file), 'r') as f:
                    content = f.read()
                    if BASE_TEMPLATE not in content:
                        print(f"Template {file} does not extend the base template.")

validate_templates('templates/')

9. Integrate Static Files

Ensure that static files such as CSS and JavaScript are correctly linked using Django’s static template tag. Update your base template to include these resources:

<link rel="stylesheet" href="{% static 'styles.css' %}">

10. Finalize and Maintain

Finally, keep your templates updated and maintained. Use Python to automate repetitive tasks, ensuring that templates are consistent and adhere to the project’s requirements.

By using Python to manage and prepare HTML templates for Django, you can effectively handle common sections like headers, footers, and sidebars. Automation and standardization will streamline your development process, leading to a consistent and high-quality user experience across your website.


Thank you for following along with this tutorial. We hope you found it helpful and informative. If you have any questions, or if you would like to suggest new Python code examples or topics for future tutorials/articles, please feel free to join and comment. Your feedback and suggestions are always welcome!

You can find the same tutorial on Medium.com.

Leave a Reply