我有一个简单的模型表单,我添加了一个简单的复选框:
class OrderForm(forms.ModelForm):
more_info = models.BooleanField(widget=forms.CheckboxInput())
def clean(self):
if 'more_info' not in self.cleaned_data:
self.instance.details = ""
class Meta:
model = Order
fields = ('details', 'address', ) # more fields
但这不起作用,即使未选中复选框(并且if
块已执行,已调试),“详细信息”字段仍会由用户值更新。我也尝试更改self.cleaned_data['details']
而不是self.instance.details
,但它也不起作用。
这不是那么重要,在客户端我有一个简单的javascript代码,如果选中该复选框,它会隐藏/显示详细信息字段。
答案 0 :(得分:1)
class OrderForm(forms.ModelForm):
more_info = models.BooleanField(required=False)
def clean(self):
cleaned_data = super().clean()
if not cleaned_data['more_info']:
cleaned_data['details'] = ''
return cleaned_data
此方法[
clean()
]可以根据需要返回完全不同的字典,该字典将用作cleaned_data
。
此外:
CheckboxInput
是BooleanField
的默认小部件。
如果您希望在表单中包含可以是
True
或False
的布尔值(例如选中或未选中复选框),则必须记住在创建时传入required=False
BooleanField
。
答案 1 :(得分:0)
不要更新cleaned_data
,而是尝试覆盖save
方法
def save(self, force_insert=False, force_update=False, commit=True, *args, **kwargs):
order = super(OrderForm, self).save(commit=False)
if not self.cleaned_data.get('more_info', False):
order.details = ""
if commit:
order.save()
return order
此外,如果您想使用clean
方法,您需要首先打电话给超级干净。
def clean(self):
cleaned_data = super(BailiffAddForm, self).clean()
if not cleaned_data.get('more_info', False):
...
return cleaned_data