django でユーザー登録フォーム

django でユーザー登録フォーム

django でユーザー登録フォームを作成したので残しておきたいと思います。

参考:
  ・python 正規表現でメールアドレスの一致チェック、抽出を行う
  ・【clean】djangoでフォームを複数のカラムにまたがって入力チェックする

コード

コードは下記の通りになります。


import re
from django.contrib.auth import forms as auth_forms
from django.core.exceptions import ValidationError
from django import forms
from .models import User


class RegistrationForm(forms.Form):
    username = forms.CharField(
        label='ユーザー名',
        max_length=50,
        min_length=1,
        required=True,
        widget=forms.TextInput(attrs={'placeholder': 'username'}),
    )
    email = forms.CharField(
        label='メールアドレス',
        max_length=50,
        min_length=1,
        required=True,
        widget=forms.TextInput(attrs={'placeholder': 'email'}),
    )
    password1 = forms.CharField(
        label='パスワード',
        max_length=50,
        min_length=8,
        required=True,
        widget=forms.PasswordInput(attrs={'placeholder': 'password'}),
    )
    password2 = forms.CharField(
        label='パスワード',
        max_length=50,
        min_length=8,
        required=True,
        widget=forms.PasswordInput(attrs={'placeholder': 'password(confirm)'}),
    )

    def clean_username(self):
        username = self.cleaned_data['username']
        if not username or username == '':
            raise ValidationError('ユーザー名を入力して下さい。')
        if len(username) > 50:
            raise ValidationError('ユーザー名が長すぎます。')
        exist_username = User.objects.filter(username=username).exists()
        if exist_username:
            raise ValidationError('ユーザー名は既に登録されています。')
        return username

    def clean_email(self):
        email = self.cleaned_data['email']
        if not email or email == '':
            raise ValidationError('メールアドレスを入力して下さい。')
        if len(email) > 50:
            raise ValidationError('メールアドレスが長すぎます。')
        pattern = '^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
        if not re.match(pattern, email):
            raise ValidationError('正しいメールアドレスを入力してください。')
        exist_email = User.objects.filter(email=email).exists()
        if exist_email:
            raise ValidationError('メールアドレスは既に登録されています。')
        return email

    def clean_password1(self):
        password1 = self.cleaned_data['password1']
        if not password1 or password1 == '':
            raise ValidationError('パスワードを入力して下さい。')
        if len(password1) > 50:
            raise ValidationError('パスワードが長すぎます。')
        if len(password1) < 8:
            raise ValidationError('パスワードは8文字以上設定して下さい')
        return password1

    def clean(self):
        password1 = self.cleaned_data['password1']
        password2 = self.cleaned_data['password2']
        if password1 != password2:
            raise ValidationError('パスワードが一致しません。')