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).
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