1

我有一个表单,只有在选择单选按钮时才需要一些字段。

如果我将该字段设置为“required = True”,那么它的行为是期望的,但是当未选择单选按钮时,如何让它表现为“required = False”?

我想我会选择一个默认值,required=False然后检查单选按钮的值,form.clean()并为现在需要的那些字段调用一个clean_<field>,但这似乎并不那么简单。或者是吗?

或者,我将从 开始required=True,然后form.clean()检查单选按钮的值,如果未设置,那么只需删除不再需要的字段引发的任何错误?

4

2 回答 2

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]
于 2013-07-04T02:06:50.080 回答
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 它运行几乎完全通过这种情况,展示了如何基于另一个字段测试一个字段,以及如何在丢失时引发表单级错误或将错误绑定到其中一个字段。

于 2013-07-04T02:06:40.417 回答