Динамические теги шаблонов в django

Я создаю html-страницу в Django, которая имеет следующую структуру:

{% extends 'main/base_template.html' %}
{% load filters %}

{% block main_window %}
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
    <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
        <h1 class="h2">Stuff</h1>
    </div>
    <div class="row mb-3">
        <div class="col-12 col-md-6">
            {% include 'main/stuff/stuff_A.html' %}
        </div>
        <div class="col-12 col-md-6">
            {% include 'main/stuff/stuff_B.html' %}
        </div>
    </div>
    <div class="row mb-3">
        <div class="col-12 col-md-6">
            {% include 'main/stuff/stuff_C.html' %}
        </div>
        <div class="col-12 col-md-6">
            {% include 'main/stuff/stuff_D.html' %}
        </div>
    </div>
{% endblock %}

Каждый html-файл stuff_X имеет одинаковую структуру, например:

<div class="row mb-3">
    <div class="table-responsive">
        <table class="table table-striped table-sm caption-top" style="width:40em">
            <caption>Data</caption>
            <thead>
            <tr>
                <th scope="col">Data1</th>
                <th scope="col">Data2</th>
                <th scope="col">Data3</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td id="stuff_a_data1" style="width:5em">{{ stuff_a.data1 }}</td>
                <td id="stuff_a_data2" style="width:5em">{{ stuff_a.data2 }}</td>
                <td id="stuff_a_data3" style="width:5em">{{ stuff_a.data2 }}</td>
            </tr>
            </tbody>
        </table>
    </div>
</div>

Итак, единственное, что действительно меняется, это некоторые идентификаторы и имя данных, которые будут получены из контекста django.

Есть ли механизмы, которые позволяют мне писать общие страницы для подобных случаев? Потому что сейчас я работаю с 4 (почти) одинаковыми страницами, добавляя фрагменты кода в каждую из них, когда мне нужно что-то изменить.

Заранее спасибо!

Я думаю, что вы можете обобщить {{ stuff_a.data1 }} на {{ foo.data1}}, используя

{% with stuff_a as foo, 'stuff_a' as foo_id_tag %} 
        {% include 'main/stuff/foo.html' %}
{% endwith %}

при условии, что шаблоны действительно идентичны по форме или похожи настолько, что вы можете управлять ими с помощью {%if ... %}. (Иды станут id="{{foo_id_tag}}_data1" и т.д.)

Другой способ, который не является сложным, заключается в использовании format_html в вашем коде python для генерации материала, который вы передаете шаблону через контекст. Или использовать свойство соответствующей модели. Что-то вроде

class Foo ( models.Model):
    ...

    @property
    def bar (self):
        bar = max( self.a*3 - self.b, 0 ) 
        return f"{bar:.4}" 

поэтому вы можете ссылаться на {{foo.bar}} в вашем шаблоне, который сам не может выполнить даже тривиальную арифметику над полями foo.

Не уверен, что это то, что вам нужно, но вы должны иметь возможность объединять строки с помощью фильтра шаблона add:

{% with 'main/stuff/stuff_'|add:your_variable|add:'.html' as filename %}
  {% include filename %}
{% endwith %}

Вам нужно будет передать your_variable из вашего views.py, очевидно.

Вернуться на верх