在Django ModelForm中动态更改字段选择

Jos*_*eph 3 django django-models django-forms

我在Model上有一个字段,如下所示:

class MyModel(models.Model):
    status_field = models.NullBooleanField(blank=False,
                                          verbose_name="Status",
                                          choices=((True, 'Approved'),
                                                   (False, 'Denied'),
                                                   (None, 'Pending')))
Run Code Online (Sandbox Code Playgroud)

然后,我有一个用于此模型的ModelForm。在那个ModelForm中,我想有条件/动态地删除这些选择之一。我目前正在尝试:

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
Run Code Online (Sandbox Code Playgroud)

从打印语句中可以看出,确实删除了该选择。但是,我必须缺少一些东西,因为在呈现表单时,此字段的小部件仍包括我删除的选择。

实际上,我正在尝试做的是防止一旦提供值后此字段变为无/空。为了方便用户,我只想在下拉菜单中删除该选项。

谢谢您的帮助!

cat*_*ran 6

然后初始化表单,将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
Run Code Online (Sandbox Code Playgroud)