Mein Modellformular erbt vom Subsystemformular. Ich möchte die Auswahlmöglichkeiten für den Benutzer im Formular einschränken. (besonders der Name) Ich weiß, ich muss Widgets verwenden. Aber es funktioniert nicht.
Ich muss SubsytemForm verwenden.
SUBSYSTEM_CHOICES = (a1,a2,a3)
Class Subsystem(models.Model):
name = models.CharField("Name", max_length=20)
class SubsytemForm(forms.ModelForm):
class Meta:
model = Subsystem
widgets = {
"name": ChoiceField(widget=RadioSelect, choices=SUBSYSTEM_CHOICES)
}
Antworten:
5 für die Antwort № 1Von Dokumentation der Django-Modellformulare:
Wenn Sie ein Formularfeld explizit instantiieren, wiedies geht Django voraus dass Sie sein Verhalten vollständig definieren möchten; daher default Attribute (wie max_length oder required) werden nicht aus dem entsprechendes Modell. Wenn Sie das in angegebene Verhalten beibehalten möchten Im Modell müssen Sie die relevanten Argumente explizit festlegen, wenn das Formularfeld deklarieren.
Sie können versuchen mit:
class SubsytemForm(forms.ModelForm):
name = forms.ChoiceField(widget=RadioSelect, choices= choices )
class Meta:
model = Subsystem
Du kannst auch
class SubsytemForm(forms.ModelForm):
class Meta:
model = Subsystem
def __init__(self, *args, **kwargs):
self.name_choices = kwargs.pop("name_choices", None)
super(SubsytemForm,self).__init__(*args,**kwargs)
self.fields["name"].queryset= self.name_choices
und senden name_choices
als Parameter in SubsytemForm
Schaffung. Denken Sie daran, dass Auswahlmöglichkeiten ein Abfragesatz sein sollten.
Sie sollten auch lesen Wie kann ich ForeignKey-Optionen in einer Django ModelForm filtern?
3 für die Antwort № 2
SUBSYSTEM_CHOICES
ist kein gültiger Wert für choices
Attribut, weil es keine Schlüssel / Wert-Paare hat. Sie brauchen etwas wie:
SUBSYSTEM_CHOICES = (
(a1, "a1 Display"),
(a2, "a2 Display"),
(a3, "a3 Display"),
)