我的表单只有在选中单选按钮时才需要一些字段。
如果我将字段设置为“required = True”,那么它的行为是合乎需要的,但是当未选择单选按钮时,如何使其表现为“required = False”?
我认为我的默认值为required=False
,然后检查form.clean()
中单选按钮的值,并为那些现在需要的字段调用clean_<field>
,但似乎并不那么简单。或者是吗?
或者我从required=True
开始,然后在form.clean()
中检查单选按钮的值,如果没有设置,那么只删除从不再需要的字段中引发的任何错误?< / p>
答案 0 :(得分:2)
哦,看起来,我用寂寞的方式完成了所有工作......后一个选项确实比在特定字段上查找和调用验证例程要简单得多。压缩错误要容易得多:
将所有可能需要的字段设置为required=True
,然后在form.clean()
中测试其他字段的值,如有必要,只需从self.errors
中删除错误
# payment type
payment_method = forms.CharField(max_length="20", required=True)
payment_method.widget=forms.RadioSelect(choices=PAYMENT_METHOD_CHOICES)
# credit card details
cc_number = CreditCardField(max_length=20, required=True)
cc_name = forms.CharField(max_length=30, required=True)
cc_expiry = ExpiryDateField(required=True)
cc_ccv = VerificationValueField(required=True)
def clean(self):
data = super(PaymentForm, self).clean()
if data.get('payment_method') == 'paypal':
for field_name in ['cc_number','cc_name','cc_expiry','cc_ccv']:
if field_name in self.errors:
del self.errors[field_name]
答案 1 :(得分:1)
form.clean
是正确的选择。什么是不对的是为其他字段调用clean_<field>
- 它们已经被清理,它们的值将在cleaned_data
字典中。
看看文档中的示例: https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other 它几乎完全贯穿于这种情况,显示了如何基于另一个字段测试一个字段,以及如何在丢失时引发表单级错误或将错误绑定到其中一个字段。