2017-05-22 2 views
0

Ist es möglich, dynamisch zu ändern, welche Felder in einer ModelForm angezeigt werden?Felder von ModelForm dynamisch ändern

ich nur eine kleine Anzahl von Feldern in einer ModelForm zeigen versuche, wenn der Benutzer eine neue Instanz hinzufügt (des Modells) vom Frontend (unter Verwendung eines Form hinzufügen), aber größere Anzahl von Feldern, wenn der Benutzer Änderungen eine Instanz (unter Verwendung eines Edit Formulars).

Die Form-Klasse sieht wie folgt aus etwas:

class SchoolForm(ModelForm): 

    class Meta: 
     model = School 
     #want to change the fields below dynamically depending on whether its an edit form or add form on the frontend 
     fields = ['name', 'area', 'capacity', 'num_of_teachers'] 
     widgets = { 
      'area': CheckboxSelectMultiple 
     } 
     labels = { 
      'name': "Name of the School", 
      'num_of_teachers': "Total number of teachers", 
     } 

Der Versuch, da das tut dryish scheinen mit zwei getrennten Klassen für hinzufügen und bearbeiten zu vermeiden. Ich habe einige SO-Posts mit der gleichen Frage für die Admin-Seite gefunden, wo wir die Funktion get_form() außer Kraft setzen könnten, aber das trifft hier nicht zu.

Auch this Antwort schlägt vor, verschiedene Klassen als den normalen Weg und dynamische Formen als Alternative verwenden. Vielleicht ist Dynamikformen hier der Weg nach vorne, aber nicht ganz sicher (ich habe auch die Methoden __init__() und save() der SchoolForm-Klasse außer Kraft gesetzt).

+0

Nicht sicher, ob das dynamische Erstellen des Formulars hier mit den benutzerdefinierten Methoden von '__init() __' und 'save()' ideal war. Fürs Erste habe ich alle Felder, die ich brauchte (für die _edit-Form_), in der obigen Klasse angegeben. Die _add-Form_ benötigt eine Untermenge von diesen, so dass sie einfach das aufnimmt, was sie benötigt. Ich dachte, das wäre der einfachste Weg. Für diejenigen, die Optionen erkunden möchten, fand ich [this] (https://stackoverflow.com/questions/297383/dynamically-update-modelforms-meta-class/297478#297478) und [dies] (http: // bradmontgomery. blogspot.in/2009/04/dynamically-displaying-fields-in.html) Beitrag hilfreich – Anupam

Antwort

0

Ich bin nicht richtig, wenn es eine korrekte Weise ist, aber ich benutze eine Methode in der Klasse Felder oder delete-it hinzuzufügen. Früher habe ich wie folgt aus:

class someForm(forms.ModelForm): 


    class Meta: 
     model = Foo 
     exclude = {"fieldn0","fieldn1"} 

    def __init__(self, *args, **kwargs): 
     super(someForm, self).__init__(*args, **kwargs) 

     self.fields['foofield1'].widget.attrs.update({'class': 'form-control'}) 

     if self.instance.yourMethod() == "FooReturn": 
      self.fields['city'].widget.attrs.update({'class': 'form-control'}) 
     else: 
      if 'city' in self.fields: del self.fields['city'] 

Hoffnung, es hilft.

+0

Danke @Zartch, sieht aus wie das oben genannte Aktualisieren oder Löschen eines vorhandenen Feldes. Gibt es einen Weg zu _add_-Feldern (die früher nicht in der Feldliste enthalten waren, aber im Modell sind)? – Anupam

+0

Alle nicht ausgeschlossenen Felder werden im Formular angezeigt. Wenn Sie einige Felder haben, die Sie tun möchten - es muss dynamisch sein - müssen Sie es löschen: del self.fields ['field'] – Zartch