2011-01-02 14 views
5

Angenommen, ich möchte ein Modell erstellen und aktualisieren. Welche Felder angezeigt werden und der Typ der Validierung hängt von der Aktion ab (Erstellen oder Aktualisieren). Aber sie teilen immer noch die gleiche Validierung und Funktionalität. Gibt es einen sauberen Weg, um ein ModelForm behandeln zu lassen (neben wenn nur Instanz überall existiert) oder sollte ich nur zwei verschiedene Modellformen erstellen?Django-Entwurfsmuster - Formulare zum Erstellen und Aktualisieren eines Modells

Antwort

4

Zwei Möglichkeiten fallen mir ein. Sie könnten ein Attribut in dem __init__ des Formular Verfahren eingestellt, entweder basierend auf einem Parameter übergeben Sie ausdrücklich oder basierend darauf, ob self.instance existiert und haben eine nicht-None pk:

class MyModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     # either: 
     self.edit = kwargs.pop('edit', False) 
     # or: 
     self.edit = hasattr(self, instance) and self.instance.pk is not None 
     super(MyModelForm, self).__init__(*args, **kwargs) 
     # now modify self.fields dependent on the value of self.edit 

Die andere Option ist Ihre Modelform zu Unterklasse - Behalte die gemeinsame Funktionalität in der Basisklasse und dann die spezifische Erstellungs- oder Aktualisierungsfunktion in den Unterklassen.

+0

cool, das habe ich mir auch gedacht. Ich frage mich, ob es einen besseren Weg dafür gibt, aber das sieht gut aus für mich. – killerbarney

Verwandte Themen