Machen inlines bedingte in der Django-admin
Habe ich ein Modell, das ich will, Mitarbeitern bearbeitet werden können, bis der Termin für die Veranstaltung. Wie diese:
class ThingAdmin(admin.ModelAdmin):
model = Thing
if obj.date < today: #Something like that
inlines = [MyInline,]
Das problem ist, ich habe keinen Zugriff auf die obj-Instanz auf diesem Niveau. Ich habe versucht, überschreiben get_formset(), aber nicht überall zu bekommen.
Bitte beraten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank der Kommentare die für eine änderung in 1.4. Meine Umsetzung hier nicht thread-sicher, so sollte es wirklich gelöscht worden sind.
Seit
get_formsets
übergeben wird das Objekt und ruftget_inline_instances
können wir ändern, beide Funktionen wirken auf das Objekt.Sollte dies funktionieren:
__init__
scheint nicht mehr selbst zu kreieren.inline_instances, aber jetzt gibt es eine get_inline_instances () - Methode können Sie explizit überschreiben.if obj.fieldX and obj.fieldX == "some text": [show inline "I"]
. Aber das war mir Formular-management-Fehler, ich vermute, weil die inlines wurden Hinzugefügt, um die form vor der POST fertig war, anstatt auf den BEKOMMEN als ich erwartet habe. Mein workaround ist, um die gespeicherten Objekt-und base-die show/ausblenden von inlines auf das Objekt, anstelle von "obj" - parameter. ieif obj: saved_obj = ModelName.objects.get(pk = obj.pk)
dann die überprüfung saved_obj die Felder anstelle von obj auf den Feldern. (django 1.8)Ich hatte einen komplexen Fall, wo die Lösungen, die ich versuchte ist fehlgeschlagen auf unerwartete Weise (Probleme mit readonly-Feldern in inlines). Dies ist die klare und ausfallsichere Möglichkeit, die ich gefunden habe:
Dies ist die Arbeit in Django 1.4.x.
Als von Django 2.2.2 (derzeit aktuellste version, als dies geschrieben wurde), würde ich die Lösung oben von @aggieNick02, die zu überschreiben
get_inline_instances
unten dargestellt.Bin ich Entsendung diese neue Antwort, weil ab April 17th, 2019 in diese verpflichten, es sieht aus wie die Zukunft empfohlene Weg, dies zu tun wäre, um stattdessen überschreiben Sie die
get_inlines
Methode. So in späteren Versionen, die Lösung könnte so Aussehen wie der code unten festlegen können, um verschiedene Sätze von inlines und nutzen Sie, basierend auf einer Bedingung.In der letzten version von Django, müssen Sie überschreiben ModelAdmin.get_formsets. z.B.
Ich denke, die beste Antwort wird in der django-Dokumentation: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/
Suche nach "get_inline_instances" Das Beispiel ist sehr gut und die Nuancen des Aufrufs werden im detail beschrieben.
Ich hatte eine situation, wo ich brauchte, um zu zeigen, Inline basiert auf der admin-Website, die Sie wurden auf für eine bestimmte Geschichte.
Ich war in der Lage, dynamische inlines arbeiten für Django 1.3 mit dem folgenden code:
In highlights/admin.py
In story/admin.py
Eine Sache zu beachten ist, dass ich nicht nur die Manipulation von inline-Klassen(HighlightInline), sondern eher, ich bin wechselnden inline-Instanzen(HighlightInline(selbst.Modell, selbst.admin_site)). Dies ist, weil django hat bereits konstruiert eine Liste der inline-Instanzen basierend auf einer Liste von inline-Klassen in den ersten Bauabschnitt des admin-class.
Ich denke, der einfachste Weg, um diesen hack zu rufen Sie Ihre benutzerdefinierten funciton in
get_fields
, oderget_fieldsets
und so weiter, setzen Sie einfachself.inlines
in einer benutzerdefinierten Funktion.Den meisten schlüsselfertige Weg, dies jetzt zu tun ist, überschreiben und super-Aufruf get_inline_instances.
Dieser stellt MyInline, wenn Sie es wollen und nicht, wenn Sie nicht. Wenn Sie wissen, das nur inline-Sie haben in Ihrer Klasse ist MyInline, können Sie machen es noch einfacher: