Вопрос

Я занимаюсь 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top