如何制作一些django表单字段取决于其他字段的值?

时间:2013-07-04 01:51:21

标签: django django-forms

我的表单只有在选中单选按钮时才需要一些字段。

如果我将字段设置为“required = True”,那么它的行为是合乎需要的,但是当未选择单选按钮时,如何使其表现为“required = False”?

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

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

2 个答案:

答案 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 它几乎完全贯穿于这种情况,显示了如何基于另一个字段测试一个字段,以及如何在丢失时引发表单级错误或将错误绑定到其中一个字段。