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

动态删除django模型表单中字段的排除项,django,django-forms,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... 表格: 我想做这样的事情(或类似

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

型号:

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...
表格:

我想做这样的事情(或类似的事情…):

这几乎与本文类似(我希望默认情况下排除该字段):

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

class MyExcludedModelForm(MyModelForm):
    class Meta:
        excludes = ('my_bool',) # or could use fields in similar manner
2) 您可以覆盖表单的构造函数:
(与其他SO发布参考中所述相同)


如果覆盖构造函数,则在调用超类构造函数(如mgalgs)之前,需要
pop
kwargs中的值提到:

def __init__(self, *args, **kwargs):
    enable_my_bool = kwargs.pop('enable_my_bool', True) # True is the default
    super(MyModelForm, self).__init__(*args, **kwargs)
    if not enable_my_bool:
        self.fields.pop('my_bool')

最终与解决方案1一起运行。。。不完全满意此解决方案,因为它违反了DRY,但它可以工作…您需要在处理
self.fields
之前调用超类构造函数。
class MyExcludedModelForm(MyModelForm):
    class Meta:
        excludes = ('my_bool',) # or could use fields in similar manner
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)
def __init__(self, *args, **kwargs):
    enable_my_bool = kwargs.pop('enable_my_bool', True) # True is the default
    super(MyModelForm, self).__init__(*args, **kwargs)
    if not enable_my_bool:
        self.fields.pop('my_bool')