0

Django:clean_()メソッドを呼び出したくない場合、それを行うことはできますか?

class myForm(forms.Form):
    userId = forms.CharField(max_length=30, required=False,)
    email = forms.EmailField(required=False,)

    def clean_userId(self):
        if 'userId' in self.cleaned_data:
            if not re.search(r'^\w+$', self.cleaned_data['userId']):
                raise forms.ValidationError('Invalid ID')
            try:
                User.objects.get(username=self.cleaned_data['userId'])
            except ObjectDoesNotExist:
                return self.cleaned_data['userId']
            raise raise forms.ValidationError('Invalid ID')
        else:
            raise raise forms.ValidationError('Invalid ID')

「email」フィールドのみを検証するために、フォーム検証を使用したい場合があります。

以下のように:

>>> form = myForm({'email':'abc@com'})
>>> form.cleaned_data['email']
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'myForm' object has no attribute 'cleaned_data'
>>> print form.errors
<ul class="errorlist"><li>workers<ul class="errorlist"><li>Invalid ID</li></ul>

方法はありますか?

4

2 に答える 2

0

定義する必要はありません。定義するclean_userId()だけclean_email()clean()、Formのそのメソッドですべてを実行できます。

class MyForm(forms.Form):
    # fields

    def clean(self):
        cleaned_data = super(MyForm, self).clean()
        email = cleaned_data.get('email')

        # do some validation

        return cleaned_data

アクセスする前にcleaned_data、呼び出しを忘れないでくださいform.is_valid()

于 2013-02-16T12:25:43.100 に答える
0

次のようなことを試すことができます:

form = myForm({'email':'abc@com'})
try:
    form.clean_email()
except forms.ValidationError:
    #do whatever
else:
    #do whatever

is_valid()cleanすべてを呼び出すので、必要なcleanメソッドを呼び出すだけです。

また、2つの異なるフォーム、または別のフォームから継承するフォームを使用することもできます。これは、はるかに優れたIMOになります。

于 2013-02-16T15:26:26.757 に答える