Передача переменных в расширенный шаблон
У меня есть шаблоны, которые впоследствии расширяют все остальные мои шаблоны.
Самым базовым шаблоном является base.html. Он включает в себя панель навигации:
{% include 'includes/navigation.html' %}
Навигационная панель должна отображать разные заголовки в зависимости от установленной роли:
{% if role == "admin" %}
<p class="title">Welcome to the Administrator Dashboard!</p>
{% elif role == "user" %}
<p class="title">Welcome to your Dashboard!</p>
{% endif %}
Из файла base.html расширяется несколько других макетов, например, 2_column.html
{% extends "layouts/base.html" %}
{% block content %}
<div class="block block_main col-md-9">
{% block block_main %}{% endblock block_main %}
</div>
<div class="block block_side col-md-3">
{% block block_side %}{% endblock block_side %}
</div>
{% endblock content %}
И только из этих шаблонов я строю все остальные html файлы. Например, login.html:
{% extends "layouts/2_column.html"%}
{% block block_main %}
<h3 class="block_title">Login</h3>
<form method="post">
<!-- Form -->
<div class="input-group">
<label for="file_id">Username</label>
<input type="text" id="username">
</div>
</form>
{% endblock block_main %}
Я не могу понять, как корректно передать роль до самого navigation.html. Возможно ли это вообще? Я пытался обернуть весь шаблон в:
{% with role="admin" %} {% endwith %}
но если {% extends ... %} находится внутри, он сообщает мне, что тег with не определен.
Я пытался передать переменную с помощью extends: {% extends "layouts/2_column.html" with role="publisher" %} но extends takes only one argument.
Я знаю, что могу передать переменную в view.py в методе render_template, но есть ли способ сделать это из слоя шаблона - это действительно ответственность шаблона за рисование правильного заголовка?
Не имеет значения, какой html включает/расширяет что. Вы можете и должны передавать эту информацию в views. Вы можете сделать это в представлении на основе класса или метода. Пример:
class YourView(DjangoView):
...
extra_content = {'role_admin': True if user.is_superuser else False}
...
Затем в html:
{% if role_admin %}
<p class="title">Welcome to the Administrator Dashboard!</p>
{% else %}
<p class="title">Welcome to your Dashboard!</p>
{% endif %}