Наследство шаблона множественного уровня в Jinja2?
-
21-09-2019 - |
Вопрос
Я занимаюсь HTML/CSS по торговле, и я работаю над проектами Django и выключаю проект Django. В настоящее время я работаю на сайте, который использует Jinja2, который я использовал в течение около 2 недель. Я только что узнал, прочитав документацию о том, что Jinja2 не поддерживает наследство шаблона с несколькими уровнями, так как вы не можете сделать больше, чем один
{% extends "foo" %}
за рендеринг. Теперь я почти уверен, что вы можете сделать это в Django, что является мощным, потому что вы можете указать базовый шаблон, указать 3 или 4 шаблона на основе этого, а затем построить мясо ваших страниц, используя эти базовые шаблоны. Разве не смысл наследования, поэтому у вас есть больше возможностей для абстракции, так что вы, единственное, что действительно возится с уникальным кодом?
В любом случае я понятия не имею, что здесь делать. Я не знаю, есть ли какой -нибудь способ сделать это, который будет работать так же хорошо, как это могло бы с шаблонами Django. Я не совсем эксперт в Django или Jinja (2), но я могу предоставить любую необходимую информацию.
Решение
То, как документация сформулировала это, казалось, что она не поддерживала глубокие уровни наследства (n).
В отличие от Python Jinja не поддерживает множественное наследство. Таким образом, вы можете иметь только один тег расширения, называемый для рендеринга.
Я не знал, что это было просто правило, сказав, что 1 продлится на шаблон .... теперь я знаю, с некоторой помощью канала Jinja IRC.
Другие советы
Один из лучших способов достичь нескольких уровней шаблона с использованием Jinja2 - это использовать »включить« пусть сказать, что у вас есть »base_layout.html'Как ваш базовый шаблон
<!DOCTYPE html>
<title>Base Layout</title>
<div>
<h1>Base</h1>
.... // write your code here
{% block body %}{% endblock %}
</div>
А потом вы хотите иметь 'child_layout.html«Это расширяет» base_layout.
{% include "base_layout.html" %}
<div>
... // write your code here
</div>
{% block body %}{% endblock %}
А теперь ваша страница может просто расширяться »child_layout.html'И это будет оба base_layout.html а также child_layout.html
{% extends "child_layout.html" %}
{% block body %}
...// write your code here
{% endblock %}
Попробуйте это, эта работа для меня благодаря ответу @IXM.
base.html
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
{% block content %}{% endblock %}
</body>
</html>
Content.html
{% extends "base.html" %}
{% block content %}
<table>
<tr>
{% include "footer.html" %}
</tr>
</table>
{% endblock %}
cooler.html
{% block footer %} <td> test</td>{% endblock %}
и позвонить с
env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
template = env.get_template('content.html')
html = template.render()
print html
Недавно я столкнулся с той же проблемой. Я хотел унаследовать несколько детских шаблонов, и это сработало. Чтобы проиллюстрировать это, я хотел бы показать вам решение, которое сработало для меня:
У меня был файл base.html, который имеет блочный содержимое и расширяется с помощью Manage.html. и что Manage.html имеет блочную sub_manage, которая расширена интернет -_маркетом.html, так что визуально выглядит так:
|- base.html (block content)
|--manage.html (extends base.html)
|---sub_manage.html (extends manage.html)
Когда я выполнил это, все работало нормально, что означает, что вы можете получить несколько { % расширения %} в одном рендере. Единственное, что если вы используете относительные ссылки на свои файлы CSS или JS, то это может не сработать, скорее это будет отображаться, но не найдет ваши файлы CSS/JS. как:
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css">
<script type="text/javascript" src="../static/js/bootstrap.min.js"></script>
<style type="text/css">
</head>
В этом случае вы должны использовать динамические ссылки с помощью url_for. как:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="{{url_for("static", filename = "css/bootstrap.min.css")}}">
<script type="text/javascript" src="{{url_for("static", filename = "js/bootstrap.min.js")}}"></script>
<style type="text/css">
Смотрите документацию расширение, включая, а также импорт.
Это обеспечивает средства получения функциональности из нескольких файлов для разных целей и отличается от глубины гнездования. Вы можете отлично иметь шаблон, который расширяет шаблон, который расширяет шаблон ...
Вы можете использовать следующий способ объединения различных содержимого в один макет. HTML для различных конструкций макета:
{% if instance == 'type1' %}
{% elif instance == 'type2' %}
{% else %}
{% endif %}
... и позвоните:
render_template('layout', instance='%s' % instance)
в коде Python.