1

ラジオ ボタンが選択されている場合にのみ、いくつかのフィールドを必要とするフォームがあります。

フィールドを「required=True」に設定すると、希望どおりに動作しますが、ラジオボタンが選択されていないときに「required=False」として動作させるにはどうすればよいですか?

デフォルトの をrequired=False選択し、ラジオ ボタンの値をチェックして、現在必須になっているフィールドform.clean()の を呼び出すことclean_<field>を考えていますが、それほど単純ではないようです。またはそれは?

または、から始めてrequired=Trueform.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_datadictに含まれています。

ドキュメントの例を見てください: https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other 実行されますほぼ正確にこのシナリオを通じて、あるフィールドを別のフィールドに基づいてテストする方法と、欠落している場合にフォームレベルのエラーを発生させる方法、またはエラーをフィールドの 1 つにバインドする方法を示します。

于 2013-07-04T02:06:40.417 に答える