动态删除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')