Können wir an einen {% block%} anhängen, anstatt ihn zu überschreiben?

115

In meiner core.html habe ich einen Block mit der Bezeichnung Javascript. Es wäre großartig, wenn ich mehr Zeilen an diesen Block anhängen könnte, ohne alles darin zu überschreiben.

PKKid
quelle

Antworten:

9

Die Verwendung block.superfunktioniert gut, wenn eine Vorlage erweitert wird, aber nicht so gut, wenn eine Vorlage eingefügt wird, z.

{% extends "base.html" %} vs. {% include "partial.html" %}

Angenommen, Sie möchten eine Vorlage in die Mitte Ihrer Seite einfügen und möchten außerdem, dass am Ende der Seite in einem Block Javascript hinzugefügt wird: Das Aufrufen block.superder enthaltenen Vorlage stürzt ab.

Vgl. Django gibt # 7324 , # 12008 , # 13399 und das zugehörige Update der Dokumentation aus . Vgl. Tag- Hinweis einschließen :

Das Include-Tag sollte als Implementierung von "Diese Untervorlage rendern und den HTML-Code einschließen" und nicht als "Diese Untervorlage analysieren und ihren Inhalt so einschließen, als ob sie Teil der übergeordneten Vorlage wäre" betrachtet werden. Dies bedeutet, dass zwischen den enthaltenen Vorlagen kein gemeinsamer Status besteht. Jedes Include ist ein völlig unabhängiger Renderprozess.

Blöcke werden ausgewertet, bevor sie aufgenommen werden. Dies bedeutet, dass eine Vorlage, die Blöcke aus einer anderen enthält, Blöcke enthält, die bereits ausgewertet und gerendert wurden - keine Blöcke, die beispielsweise von einer erweiterten Vorlage überschrieben werden können.

In diesem Fall würde ich die Verwendung von Django-Sekizai empfehlen, mit dem Sie Folgendes tun können:

{% load sekizai_tags %}

                                  <p>Some content</p>
<p>Some content</p>             | {% addtoblock "js" %}
                                |   <script type="text/javascript">
{% include "partial.html" %} ->      alert("Hello django-sekizai");
                                |   </script>
<p>Some more content</p>         {% endaddtoblock %}


{% render_block "js" %}

Aus django-sekizai README :

Der Hauptgrund, warum ich dieses Projekt gestartet habe, war das Fehlen eines guten Medien-Frameworks (CSS / JS) in Django und Django-CMS. Ja, es gibt die Medienklasse, die in Formularen in Django verwendet wird, aber das funktioniert wirklich nicht so gut. Normalerweise möchten die Frontend-Leute entscheiden, ob CSS- und Javascript-Dateien aufgenommen werden sollen, und sie möchten keine Python-Dateien bearbeiten müssen, um dies zu ändern, und ich wollte auch nicht, dass sie meine Python-Dateien ändern. Aus diesem Grund mussten Sie den Inhalt von Vorlagen bearbeiten können, die sich vor oder nach dem Punkt befinden, an dem Sie sich jetzt befinden. Außerdem wollte ich, dass Duplikate entfernt werden. Als Ergebnis schrieb ich Django-Sekizai, was genau das tut. Es ist ähnlich wie bei Blöcken, nur anstatt sie zu erben, erweitern Sie sie.

Maxime R.
quelle