Frage

Ich mache HTML/CSS nach Handel und habe als Vorlagendesigner an Django -Projekten gearbeitet. Ich arbeite derzeit an einer Website, die Jinja2 verwendet, die ich seit ungefähr 2 Wochen benutze. Ich habe gerade das Lesen der Dokumentation herausgefunden, dass Jinja2 keine mehrstufige Vorlageerbschaft unterstützt, da Sie nicht mehr als einen machen können

{% extends "foo" %}

pro Rendering. Jetzt bin ich mir ziemlich sicher, dass Sie dies in Django tun können, was leistungsfähig ist, da Sie eine Basisvorlage angeben, 3 oder 4 Vorlagen basierend darauf angeben und dann das Fleisch Ihrer Seiten mit diesen Basisvorlagen bauen können. Ist nicht der Vererbungsgrund, also haben Sie mehr Kraft zum Abstract, und Sie haben also nur wirklich ein einzigartiges Code?

Auf jeden Fall habe ich keine Ahnung, was ich hier tun soll. Ich weiß nicht, ob es eine Möglichkeit gibt, wie ich es tun kann, die so gut wie bei den Django -Vorlagen funktionieren kann. Ich bin nicht gerade ein Experte bei Django oder Jinja (2), aber ich kann alle benötigten Informationen bereitstellen.

War es hilfreich?

Lösung

Die Art und Weise, wie die Dokumentation es formulierte, schien es so, als hätte sie die Erbschaft (n) nicht tiefen.

Im Gegensatz zu Python Jinja unterstützt nicht mehrfache Vererbung. Sie können also nur ein erweitertes Tag mit dem Namen pro Rendering haben.

Ich wusste nicht, dass es nur eine Regel war, in der ich sagte, dass ich mich pro Vorlage erweitert ... Ich weiß jetzt, mit Hilfe des Jinja IRC -Kanals.

Andere Tipps

Einer der besten Möglichkeiten, um mit Jinja2 mehrere Vorlagenebene zu erzielen, besteht darin, zu verwenden. "Lassen Sie sich von Ihnen haben, Sie haben".Base_Layout.html'Als Basisvorlage

<!DOCTYPE html>
<title>Base Layout</title>
<div>
  <h1>Base</h1>
  .... // write your code here
  {% block body %}{% endblock %}
</div>

Und dann willst du ''child_layout.htmlDas erweitert Base_Layout.

{% include "base_layout.html" %}
  <div>
  ... // write your code here
  </div>
{% block body %}{% endblock %}

Und jetzt kann sich Ihre Seite nur erstrecken.child_layout.html'Und es wird beide haben Base_Layout.html und child_layout.html

{% extends "child_layout.html" %}
{% block body %}
  ...// write your code here
{% endblock %}

Probieren Sie dies aus, diese Arbeit für mich dank @IXM Antwort.

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 %}

footer.html

{% block footer %} <td> test</td>{% endblock %}

und rufen Sie mit

env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
template = env.get_template('content.html')
html = template.render()
print html

Ich habe kürzlich dem gleichen Problem konfrontiert. Ich wollte mehrere Kindervorlagen erben und es funktionierte. Um es zu veranschaulichen, möchte ich Ihnen eine Lösung zeigen, die für mich funktioniert hat:

Ich hatte eine Base.html -Datei, die blockierte und von verwaltet.html erweitert wurde. Und das verwaltet.html hat ein Block sub_manage, das von Internet_market.html erweitert wird. Visuell sieht es so aus:

|- base.html (block content)
|--manage.html (extends base.html)
|---sub_manage.html (extends manage.html)

Wenn ich es rendert, hat alles gut funktioniert, was bedeutet, dass Sie mehrere { % Expendent %} in einem Render haben können. Das Einzige ist, dass wenn Sie relative Links zu Ihren CSS- oder JS -Dateien verwenden, es möglicherweise nicht funktioniert, sondern dass es Ihre CSS/JS -Dateien nicht erfolgt. wie:

<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>

In diesem Fall müssen Sie dynamische Links verwenden, indem Sie URL_FOR verwenden. wie:

<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">

Siehe Dokumentation sich erweitern, einschließlich, und Import.

Dies liefert die Möglichkeit, Funktionen aus mehreren Dateien für unterschiedliche Zwecke zu erhalten, und unterscheidet sich von der Tiefe des Verschachtelns. Sie können perfekt eine Vorlage haben, die eine Vorlage erweitert, die eine Vorlage erweitert ...

Sie können den folgenden Weg verwenden, um verschiedene Inhalte in ein einzelnes Layout zu kombinieren.

{% if instance == 'type1' %}

{% elif instance == 'type2' %}

{% else %}

{% endif %}

...und Ruf an:

render_template('layout', instance='%s' % instance)

im Python -Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top