2009-08-05 12 views
0

App_1 hat eine Ansicht und eine Vorlage für diese Ansicht. Es möchte Informationen aus anderen Quellen (d. H. Anderen Apps) in diese Ansicht "aggregieren", ohne selbst etwas hinzufügen oder ändern zu müssen. Vielleicht möchte App_2 "Hallo Welt" in diesem bestimmten Bereich in App_1 anzeigen. Was ist der beste Weg, dies zu erreichen?Fügen Sie Vorlagenelemente aus anderen Apps in Django dynamisch hinzu.

Signale kommen natürlich in den Sinn. Aber was sollten Signalempfänger zurücksenden? Meiner Meinung nach enthält die App_1-Vorlage ein benutzerdefiniertes Tag, das ein Signal sendet und eine Liste mit Vorlagen (z. B. "app_2/template.html") zurückerhält, die jeweils registriert werden. Es scheint jedoch, dass inclusion_tag nur 1 Template-Rendering für jedes Tag unterstützt.

Welchen Rückgriff habe ich?

Antwort

2

Ich habe getan, was ich beschrieben habe, aber ohne die Standard-inklusion_tag-Unterstützung. Ich habe ein benutzerdefiniertes Tag erstellt, das Signale gesendet, Vorlagennamen gesammelt und einen Knoten erstellt hat, der jede Vorlage seriell rendert und das Ergebnis verkettet. Dies scheint gut zu funktionieren und hat die gleiche Logik wie das Inclusion-Tag shebang.

0

Ich hoffe, ich verstehe richtig, aber es scheint, dass Ihre Lösung für dieses Problem in Ihrem zweiten Satz ist: "Aggregat". Die Ansicht Funktion in App_1 sollte alle erforderlichen Daten sammeln oder sammeln und dann über eine Kontextvariable an die Vorlage übergeben.

Ich denke, die Frage, die gelöst werden muss, ist: Wie kann die Ansicht Funktion welche Daten zu aggregieren?

In der Regel wird eine Ansichtsfunktion im Voraus codiert, um zu wissen, welche Daten verwendet werden müssen. Beispielsweise könnte eine Kalender-App fest programmiert sein, um Event-Model-Objekte abzurufen und diese an die Vorlage zu übergeben (über Kontext). In Ihrem Fall scheint es jedoch, dass die in App_1 eingehenden Daten vollständig willkürlich und nicht zuvor definiert sind.

Sie erwähnten Signale, aber ich denke, das Problem, das Sie hier haben werden, ist, dass Signale nur eine Benachrichtigung geben, dass ein Ereignis aufgetreten ist. Sie erlauben nicht, dass die Einschaltungsfunktion Daten zurückgibt, noch wartet der Code, der das Signal abgibt, darauf, dass alle Signalempfänger die Verarbeitung beenden, bevor sie fortfahren.

Stattdessen könnten Sie vielleicht ein Registrierungssystem einrichten. App_ 1 verwaltet eine Liste von etwas. Die anderen Apps registrieren Objekte in dieser Liste und wenn die Ansichtsfunktion in App_1 ausgelöst wird, verwandelt sie die Liste in verwendbare Daten und leitet sie dann über eine Kontextvariable an die Vorlage weiter.

+0

Ah, aber Signale haben Rückgabewerte :) Diese "Pull from Listener" -Funktionen sind ziemlich praktisch. Wie auch immer, ich habe sowieso ein Inclusion-Tag mit mehreren Vorlagen programmiert, da die Logik des Renderns anderer Vorlagen nicht in Ansichten enthalten sein sollte (was ich ursprünglich getan hatte). –

Verwandte Themen