2013-07-04 55 views
1

我有一个窗体,只有在选择单选按钮时才需要一些字段。如何使一些Django表单域取决于其他字段的值?

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

我想我会去的required=False默认然后检查单选按钮的值form.clean(),并呼吁为clean_<field>对于那些现在需要的字段,但它似乎并没有那么简单。或者是?

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

回答

0

form.clean是正确的做法。不正确的是在其他字段中调用clean_<field> - 它们已经被清理,其值将在cleaned_data字典中。

看一看在文档的例子: https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other 它贯穿几乎完全此方案中,展示了如何可以基于另一个测试一个领域,以及如何丢失时,您可以提高窗体级错误或绑定错误的领域之一。

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] 
删除错误
相关问题