Wie werden verschiedene Inlines abhängig vom aktuellen Objektfeldwert angezeigt?

8

Bei einem Modell mit dem Namen MainModel und einem RelatedModel , wobei das spätere ein ForeignKey -Feld an MainModel hat:

%Vor%

und die entsprechenden ModelAdmin-Klassen:

%Vor%

Und das ist das Standardverhalten. Sie erhalten zwei Inlines, eines für jedes verwandte Modell. Die Frage ist, wie alle Inlines bei der Erstellung der MainModel -Instanz vollständig ausgeblendet werden (die ModelAdmin s add_view ) und die Inlines für RelatedModel1 angezeigt werden, wenn das type -Feld von MainModel instance ist True und zeigt die Inlines für RelatedModel2 bei False .

an

Ich wollte einen Deskriptor für das ModelAdmin.inline_instances -Attribut erstellen, aber ich erkannte, dass ich benötigen Zugriff auf die zu bearbeitende Objektinstanz, werden aber als Parameter übergeben.

Irgendwelche Hilfe?

Danke!

    
Armando Pérez Marqués 10.11.2011, 02:02
quelle

5 Antworten

4

@Yuji 'Tomita' Tomitayou die Idee war gut, ich hatte die gleiche, aber einmal versucht, erkannte ich, dass Sie auch bestimmte Schlüssel aus self.inlines entfernen müssen, weil in change_view und add_view method self.get_inline_instances(request) zuvor aufgerufen wurde %Code%. Daher habe ich die Inline-Verarbeitung in get_formsets() method verschoben.

So habe ich es erfolgreich gemacht:

%Vor%     
darklow 29.01.2013 16:04
quelle
3

Mir ist klar, dass diese Frage etwas alt ist und die Codebasis sich ein wenig verändert hat; Es gibt einen sauberen Punkt, um Dinge jetzt zu überschreiben: get_inline_instances . Sie können dies tun:

%Vor%     
aggieNick02 17.10.2017 15:49
quelle
1

Von spähen bei contrib.admin.options.py Sieht so aus, als könnten Sie ModelAdmin.get_formsets überschreiben. Beachten Sie, dass die Administratorwebsite self.inline_instances bei __init__ ausfüllt, sodass Sie wahrscheinlich Ihre Inlines immer wieder folgen und nicht instanziieren möchten. Ich bin nicht sicher, wie teuer es ist:)

%Vor%

Der ursprüngliche Administrator get_formsets verwendet Generatoren - Sie könnten auch das Original genauer nachahmen:

%Vor%     
Yuji 'Tomita' Tomita 10.11.2011 10:27
quelle
0

Hier ist ein Code, den ich geschrieben habe, als ich mit dem gleichen Problem konfrontiert wurde. Es ist ein bisschen Brute-Force-Stil, denke ich, aber ist sehr agil und sollte für alle Fälle passen.

%Vor%     
Lyudmil Nenov 07.04.2014 11:51
quelle
0

Dies funktionierte für mich, als ich in dem alten Beitrag nach einer Antwort auf das gleiche Problem suchte. Erweiternd auf die Antwort von darklow, ich denke, Sie können get_inline_instances einfach komplett überschreiben und eine zusätzliche Überprüfung basierend auf Ihrem Typ hinzufügen.

  1. Fügen Sie in Ihrem Modell eine boolesche Typüberprüfungsmethode hinzu

    class MainModel (models.Model):

    %Vor%
  2. Inline-Instanzbasis auf Typprüfung hinzufügen - Kopieren Sie einfach die get_inline_insances-Methode aus der Elternklasse in Ihre admin.ModelAdmin-Klasse und fügen Sie den if-Block hinzu, um den Modelltyp wie unten gezeigt zu prüfen.

    class MyModelAdmin (admin.ModelAdmin):

    %Vor%
JHRS 04.11.2017 02:02
quelle