动态更改 Django ModelForm 中的字段选择
Dynamically alter Field choices in Django ModelForm
我在模型上有一个这样的字段:
class MyModel(models.Model):
status_field = models.NullBooleanField(blank=False,
verbose_name="Status",
choices=((True, 'Approved'),
(False, 'Denied'),
(None, 'Pending')))
然后我就有了这个模型的 ModelForm。在该 ModelForm 中,我想 conditionally/dynamically 删除其中一个选项。我目前正在尝试:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.status_field is not None:
self.fields['status_field'].choices.remove((None, 'Pending'))
print self.fields['status_field'].choices
我从打印语句中可以看出该选项确实被删除了。但是,我一定遗漏了一些东西,因为在呈现表单时,该字段的小部件仍然包含我删除的选项。
实际上,我试图做的是防止此字段在提供值后变为 None/null。为了方便用户,我想在下拉列表中删除该选项。
感谢您的帮助!
然后初始化表单,choices
属性 从字段复制到字段的小部件。所以你也必须从小部件中删除选择:
if self.instance and self.instance.status_field is not None:
new_choices = list(self.fields['status_field'].choices)
new_choices.remove((None, 'Pending'))
self.fields['status_field'].choices = new_choices
self.fields['status_field'].widget.choices = new_choices
我在模型上有一个这样的字段:
class MyModel(models.Model):
status_field = models.NullBooleanField(blank=False,
verbose_name="Status",
choices=((True, 'Approved'),
(False, 'Denied'),
(None, 'Pending')))
然后我就有了这个模型的 ModelForm。在该 ModelForm 中,我想 conditionally/dynamically 删除其中一个选项。我目前正在尝试:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.status_field is not None:
self.fields['status_field'].choices.remove((None, 'Pending'))
print self.fields['status_field'].choices
我从打印语句中可以看出该选项确实被删除了。但是,我一定遗漏了一些东西,因为在呈现表单时,该字段的小部件仍然包含我删除的选项。
实际上,我试图做的是防止此字段在提供值后变为 None/null。为了方便用户,我想在下拉列表中删除该选项。
感谢您的帮助!
然后初始化表单,choices
属性 从字段复制到字段的小部件。所以你也必须从小部件中删除选择:
if self.instance and self.instance.status_field is not None:
new_choices = list(self.fields['status_field'].choices)
new_choices.remove((None, 'Pending'))
self.fields['status_field'].choices = new_choices
self.fields['status_field'].widget.choices = new_choices