2017-03-31 3 views
0

In meiner Django-Anwendung habe ich ein Modell, X. Es hat ein verwandtes/Hilfsmodell Y, das einige zusätzliche Informationen darüber enthält. Instanzen von Y sind an ihre Xs mit einer ForeignKey gebunden (das heißt, Y enthält eine models.ForeignKey(X)).Zeige nur ein Inline-Objekt "Objekt hinzufügen", wenn keine Objekte existieren

Ich habe auch diesen Code in meinem admin.py:

class YInline(admin.TabularInline): 
    model = Y 
    extra = 1 

Dies funktioniert gut, aber das Inline-Feld ein neues Y für das Hinzufügen ist immer angezeigt: Wenn das Hinzufügen eines neuen X, und bei der Bearbeitung eines vorhandenen X, an das bereits einige Ys gebunden sind. Ich möchte das Feld nur anzeigen, wenn X noch keine Ys hat (entweder weil es erstellt wurde oder weil ihm vorher keine Ys zugewiesen wurden). Wenn wir ein X bearbeiten, das bereits einige Ys enthält, sollte das Inline nicht angezeigt werden. Der Benutzer wird die Schaltfläche "Ein weiteres Y hinzufügen" verwenden, wenn er eine hinzufügen möchte.

Wie kann ich das erreichen? Ich benutze die neueste stabile Version von Django, 1.10 zum Zeitpunkt des Schreibens.

+0

Hat die unten Antwort für Ihren Fall gearbeitet? –

Antwort

1

Sie können die get_extra Methode der YInline Klasse überschreiben, wie folgt aus:

class YInline(admin.TabularInline): 
    model = Y 
    # extra is remove here, is overidden below 

    def get_extra(self, request, obj=None, **kwargs): 
     # obj is the parent model, for your case X. 
     # If X has no Y attribute (thus X is created), return 1 extra inline 
     # If X exists, but has null Y's, return 1 extra inline 
     if not hasattr(obj, '<related_name_here>') or not obj.<related_name_here>.exists(): 
      return 1 
     # If X exists and has some pre-saved Y's, return 0 extra inlines 
     return 0 
+0

Danke, das löst das Problem. Schön zu wissen, dass es Leute gibt, die diese staubigen Ecken von Django kennen. – szczurcio

Verwandte Themen