Динамические теги шаблонов в 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, очевидно.