web-dev-qa-db-ja.com

カスタムフォーム検証

私は非常にシンプルなフォームを持っています:

from Django import forms

class InitialSignupForm(forms.Form):
    email = forms.EmailField()
    password = forms.CharField(max_length=255, widget = forms.PasswordInput)
    password_repeat = forms.CharField(max_length=255, widget = forms.PasswordInput)

    def clean_message(self):
        email = self.clean_data.get('email', '')
        password = self.clean_data.get('password', '')
        password_repeat = self.clean_data.get('password_repeat', '')

        try:
            User.objects.get(email_address = email)
            raise forms.ValidationError("Email taken.")
        except User.DoesNotExist:
            pass

        if password != password_repeat:
            raise forms.ValidationError("The passwords don't match.")

これは、カスタムフォームの検証がどのように行われていますか? emailで、そのメールアドレスを持つユーザーが現在いないことを評価する必要があります。 passwordpassword_repeat一致。どうすればこれを行うことができますか?

41
Naftuli Kay

単一のフィールドを単独で検証するには、フォームでclean_FIELDNAME()メソッドを使用できます。そのため、メールの場合:

_def clean_email(self):
    email = self.cleaned_data['email']
    if User.objects.filter(email=email).exists():
        raise ValidationError("Email already exists")
    return email
_

次に、互いに依存する相互依存フィールドの場合、すべてのフィールド(上記のemailなど)が個別に検証された後に実行されるclean()メソッドを上書きできます。

_def clean(self):
    form_data = self.cleaned_data
    if form_data['password'] != form_data['password_repeat']:
        self._errors["password"] = ["Password do not match"] # Will raise a error message
        del form_data['password']
    return form_data
_

clean_message()の取得元はわかりませんが、フォームに存在しないように見えるmessageフィールド用に作成された検証メソッドのようです。

詳細については、これを一読してください。

https://docs.djangoproject.com/en/dev/ref/forms/validation/

107
Timmy O'Mahony