动态删除django模型表单中字段的排除项

Nic*_* P. 3 django django-forms

我想以编程方式启用默认情况下排除的字段...

模型:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    an_excluded_field = models.TextField()
    my_bool = models.BooleanField(default=False) # this is the field to conditionally enable...
Run Code Online (Sandbox Code Playgroud)

形成:

class MyModelForm(ModelForm):
    class Meta:
        model = EmailTemplate
        excludes = ('an_excluded_field', 'my_bool')
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情(或者那种效果......):

form = MyModelForm(enable_my_bool=True)
Run Code Online (Sandbox Code Playgroud)

这几乎就像这篇文章(我希望默认排除字段): 如何在表单的子类中排除ModelForm中的声明字段?

Dol*_*cci 5

1)您可以定义表单的第二个版本:

class MyExcludedModelForm(MyModelForm):
    class Meta:
        excludes = ('my_bool',) # or could use fields in similar manner
Run Code Online (Sandbox Code Playgroud)

2)您可以覆盖表单的构造函数:(
与您引用的其他SO帖子中描述的相同)

class MyModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        if not kwargs.get('enable_my_bool', false):
            self.fields.pop('my_bool')
        super(MyModelForm, self).__init__(*args, **kwargs) # maybe move up two lines? (see SO comments)
Run Code Online (Sandbox Code Playgroud)

  • 在摆弄`self.fields`之前,你需要调用超类构造函数. (6认同)