Як вставити шаблон в інший шаблон?


79

У мене дуже базовий шаблон (basic_template.html), і я хочу заповнити його даними, відформатованими за допомогою іншого часткового шаблону. Basic_template.html може містити кілька речей, відформатованих за допомогою часткового шаблону.

Як слід структурувати код у views.py?

Причиною того, що я роблю це, є те, що згодом буде заповнений за допомогою Ajax. Чи правильно я це роблю?

Відповіді:


143

Ви можете зробити:

<div class="basic">
{% include "main/includes/subtemplate.html" %}    
</div>

де subtemplate.htmlінший шаблон Django. Тут subtemplate.htmlви можете помістити HTML-код, який можна отримати в Ajax.

Ви також можете включити шаблон кілька разів:

<div class="basic">
{% for item in items %}
    {% include "main/includes/subtemplate.html" %}    
{% endfor %}
</div>

вибачте, забув згадати: підшаблон може кілька разів створити екземпляр у basic_template.html
WindowsMaker

1
Це також можливо, ви можете включити шаблон у цикл for у шаблоні, див. Оновлену відповідь.
Симеон Віссер,

1
у циклі item, чи не слід передавати елемент у контексті підшаблона, наприклад {% include "includes/subtemplate.html" with item=item %}?
Капі Етріель

8
@barraponto ви можете це зробити, але itemце вже доступно в підшаблоні. Якщо ви хочете зберегти контекст допоміжного шаблону чистим, тоді ви можете використовувати {% include "includes/subtemplate.html" with item=item only %}його лише для переходу itemвід батьківського до підшаблона.
Симеон Віссер

Це слід десь додати в документах Django! Дякуємо за корисну відповідь.
varagrawal

24

Ви можете зробити це за допомогою блоку. Блоки - це тег шаблону Django, який замінює розділи шаблону, який ви розширюєте. Я навів приклад нижче.

basic_template.html

<body>
{% block 'body' %}
{% endblock %}
</body>

шаблон, який ви хочете включити: (тобто example.html)

{% extends 'basic_template.html' %} 
{% block 'body' %}
/* HTML goes here */
{% endblock %}

views.py :

return render_to_response(template='example.html', context, context_instance)

Це зробить завантаження basic_template.html , але замінить все, що знаходиться {% block 'body' %} {% endblock %}в basic_template.html, тим, що міститься всередині {% block 'body' %} {% endblock %}.

Ви можете прочитати більше про блоки та спадкування шаблонів у Документах Django


Яка різниця між тим, як робити це таким чином, і робити {% include "main / includes / example.html"%}?
Michael Lafayette

3
@MichaelLafayette, подумайте про розширення як успадкування, включаючи як імпорт.
Мокс

1
Чи існують якісь переваги щодо ефективності використання одного підходу перед іншим? {% include "main/includes/example.html" %}Підхід виглядає простіше (це підтверджує ПОЦЕЛУЙ ).
Hassan Baig


0

Я просто хотів додати відмінності розширення та включення. Як шаблон, так і включення можуть використовувати моделі, вставлені в поточний додаток. Шаблон призначений для глобального використання будь-якою програмою. Включити - для використання в певних програмах. Наприклад: ви хочете вставити повзунок зображень на домашню сторінку та про сторінку, але ніде більше. Ви можете створити програму Slider із власною моделлю для зручності та імпортувати її та включити на ці сторінки. Якби ви використовували шаблон для цього прикладу, ви створили б 2 шаблони, один із повзунком та все інше, що є в інших шаблонах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.