Bei einem Modell mit dem Namen MainModel
und einem RelatedModel
, wobei das spätere ein ForeignKey
-Feld an MainModel
hat:
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
.
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!
@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% 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:
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:)
Der ursprüngliche Administrator get_formsets
verwendet Generatoren - Sie könnten auch das Original genauer nachahmen:
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%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.
Fügen Sie in Ihrem Modell eine boolesche Typüberprüfungsmethode hinzu
class MainModel (models.Model):
%Vor%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%Tags und Links django django-admin inline-formset