Frage

Ich habe ein django Projekt pro1 mit mehreren Anwendungen: app1, app2, app3 und so weiter. Ich möchte einige Top-Level-Vorlage anzuzeigen, die Blöcke von jeder und jede App enthält:

example_base_template.html:

[header /]
[left nav bar]{{ app1 rendered template }}[/left nav bar]
[right nav bar]{{ app2 rendered template }}[/right nav bar]
[center section]{{ app1 main functionality template }}[/center section]
[footer]{{ app3 rendered template }}{{ app4 rendered template }}[/footer]

All diese App-Vorlagen sind dynamisch, die DB verwenden. Wie das in der eigensten und eleganten Art und Weise zu tun? Oder vielleicht die Frage ist, wie 4 verschiedene Ansichten zu einer URL verbinden?

War es hilfreich?

Lösung

Wir hatten ein ähnliches Problem wie dieses, und der Schlüssel ist, um die richtigen Daten in den Kontext zu bekommen. Was wir taten, war Ausbruch der Datenerstellung / Kontext für jede Ansicht Füllung in eine separate Build-the-Kontext-Routine. Die ursprünglichen Ansichten rufen Sie einfach ihre jeweilige Routine und dann ihre Vorlage machen. Die zusammengesetzte Ansicht ruft jede der kontextBauer und macht dann die Master-Vorlage, die dann enthält die Untervorlagen.

Dies ist, wo wir in ein bisschen ein Problem mit dem Django Template-System lief. Wir waren das Caching Templatefragmente und einige dieser Fragmente nahm Daten, die sehr teuer zu erzeugen. Wenn das Fragment nicht abgestanden war, wollten wir auf jeden Fall nicht die Arbeit tun. Aber Verzögerung der Arbeit, bis wir wussten, wir brauchten es bedeutete, dass wir waren jetzt in der Vorlage und:

  • Sie können keine Parameter an Methoden übergeben innerhalb einer Vorlage.
  • Die django.template .__ init __. Variable._resolve_lookup () -Methode wurde gebrochen, dass, wenn Sie eine aufrufbare weitergegeben, es würde nicht nennen! Wenn Sie eine Methode eines Objekts im Kontext verweisen, die ganz gut funktioniert.

Der Grund für Callables zur Arbeit benötigen, ist, dass es erlaubt Ihnen in einer Curry-Funktion zu übergeben - dh eine Funktion, die bereits einige (oder alle) der Parameter angegeben, aber , die aufgerufen wurde noch nicht. so ist der Ansicht (oder der Kontext Build in dem Fall) sollte eine Voll spezifizierte Funktion (nicht vergessen, können Sie nicht params in den Vorlagen selbst passieren) einzuschmeicheln der Lage sein, so dass die Vorlage , wenn es gebraucht zu könnte die aufrufbar, erhalten die Daten, rufen und wir gehen weg.

Wir haben zwei separate Ansätze dazu:

Da wir diese Seite habe ich gelernt, dass wir in der Lage gewesen wäre, es zu lösen, indem Generatoren als verzögerte Datenproduzenten verwenden. Die Generatoren wirken wie eine Art curried Funktion (in, dass Sie beliebiges params für das Setup passieren können), aber die Template-Engine sieht sie als nur ein weiteres Iterator. Es gibt eine großes Tutorial zu diesem Thema rel="nofollow. Hinweis:. Generatoren sind keine Arrays und Sie können sie nur einmal verbrauchen, so dass einige Ihrer Logik müssen optimiert werden

Die nächste Mal denke ich, dass wir nur mit jinja2 Vorlagen und stoppen mit Djangos Vorlagen Verschrauben .

Andere Tipps

Sie können mit einem {% umfassen%} Tag. Aber es macht nicht viel helfen. Die bessere Lösung ist, Gewohnheit zu schreiben Aufnahme-Tag mit dem benötigten Vorlage und Funktionalität.

Sie können nicht (in einfacher Weise) mehrere Ansichten in eine mischen. Versuchen Tags seine ziemlich django Lösung.

Ich tat dies, indem Sie benutzerdefinierte Vorlagen-Tags für jede Anwendung zu schreiben I einschließen wollte. Zunächst meine Template-Tags nur hart codiert html zurückgegeben. Später fand ich, dass die Tags ihre eigene Vorlage Fragmente laden konnte. Es gab auch irgendwo ein Snippet, das einen generischer neuesten Content-Tag war das ziemlich gut funktioniert.

Viele wiederverwendbare Anwendungen (insb. Jene, ausgewählt in den Pinax Projekt) dienen als gute Beispiele auf, wie benutzerdefinierte verwenden Template-Tags einfügen Inhalt. James Bennett sprechen in DjangoCon 2008 kann auch helfen.

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