2017-07-19 6 views
0

Ich habe ein Django-Modell 'Benutzer' mit einem Fremdschlüssel zu einem verwandten Modell 'Gruppe'.Django wählen bestehenden bestehenden Datensatz, oder erstellen Sie neue Inline

Ich benutze eine ModelForm, um das Formular zum Erstellen eines Benutzers zu rendern, der es dem Benutzer ermöglicht, eine Gruppe aus einem Dropdown der vorhandenen Gruppen auszuwählen.

Ich möchte jedoch die Option für den Benutzer eine neue Gruppe innerhalb dieses Formulars erstellen, wenn sie nicht eine gewünschte in der Liste finden.

Ich weiß, ich könnte ein Inline-Formular erstellen, aber ich bin mir nicht sicher, wie dies zu erreichen ist, während die Möglichkeit beibehalten wird, optional einen vorhandenen verwandten Datensatz auszuwählen.

Irgendwelche Ratschläge?

+0

es klingt, als ob Sie nach "get_or_create" -Methode in Python suchen. – hansTheFranz

+0

Können Sie mir eine Anleitung geben, wie das in einer Form verwendet wird? Die Gruppe enthält eine Reihe von Feldern, die bereitgestellt werden müssen, wenn der Benutzer eine 'neue' Gruppe erstellt. Bei der Auswahl einer bestehenden Gruppe muss der Benutzer keine zusätzlichen Daten eingeben. – corycorycory

+0

https://Stackoverflow.com/questions/22250352/in-django-how-do-you-programmatically-create-a-group-with-permissions wie wäre es mit dieser Antwort? Es scheint alles zu beinhalten, was du willst – hansTheFranz

Antwort

0

Nach vielen Stunden der Forschung habe ich eine Lösung gefunden.

Ich habe viele Dinge ausprobiert, einschließlich des Überschreibens der clean() -Funktion in meinem Formular, aber das erforderte das Entfernen von Unveränderlichkeit und war unordentlich, um die Validierung richtig zu machen.

Letztendlich war meine Lösung so subcasses ModelChoiceField. Überschreiben Sie im Feld für die Modellauswahl die Methode to_python() mit Ihrer Logik, um ein zugehöriges Objekt zu erstellen, falls es nicht existiert. Außerdem habe ich diesem Feld einen Parameter für den Abfrage-Parameter übergeben, so dass ich in der Lage war, das neu erstellte Objekt nur an diese Formular-Instanz zu übergeben, aber nicht auf jedem Benutzer-Formular.

class FlexibleModelChoiceField(ModelChoiceField): 
    def __init__(self, queryset, *args, **kwargs): 
     super(FlexibleModelChoiceField, self).__init__(queryset, *args, **kwargs) 
     self.queryset = queryset 

    def to_python(self, value): 
     try: 
      # Logic to get or create the model instance object 
      return model_instance_object 
     except (ValueError, self.queryset.model.DoesNotExist): 
      raise ValidationError(self.error_messages['invalid_choice'], code='invalid_choice') 
Verwandte Themen