【Django】新規ユーザー登録フォームで、登録していないメールアドレスを登録してもブロックされてしまう問題を解決したい

下記問題についてご教示頂けますと幸いです。

<解決したい問題>
【概要】
新規ユーザー登録フォームを作成し、作成時はうまく機能していた。
その後、「ユーザー新規登録→自動ログイン機能」を実装しようとしたところ表題の問題が発生。
イメージ説明

【詳細】
例外処理をemailとpasswordに実装。
email:既に登録されているメールアドレスで、新規登録をすることができない例外処理
password:入力されたデータがパスワード=パスワード確認で一致した場合のみ、新規登録を許可

<お伺いしたいこと>
登録していないメールアドレスを登録しようとしても、なぜかエラーメッセージが出てしまう問題の解決方法
※これまでは正常に動いていたので、フォームの構造自体(forms.py, models.py, テンプレート)に大きな問題はないと思われます


<現状の理解>
①forms.pyに記載したemailの例外処理は、作成時に機能はしており、問題はなかった
②フォームの作成後、他のページを作成しているのかでエラーが出るようになってしまった

<不明点>
①登録していないメールアドレスを入力してもはじかれてしまう原因は、
自身が記述した例外処理にあるのか、Djangoのデフォルトの機能にあるのか、それともほかの点にあるのか

ソースコードのマイナーチェンジを繰り返しいろいろと検証をしていますが、なかなか原因を見つけることができずご教示頂けますと幸いです。


<ソースコード>

【該当ファイル】

foms.py

foms.py

from django import forms from toppage.models import CustomUser, Linguistic_HealthData from django.core.exceptions import ValidationError class SignUpForm(forms.ModelForm): password = forms.CharField(max_length=20, widget=forms.PasswordInput()) password1 = forms.CharField(max_length=20, widget=forms.PasswordInput()) class Meta: model = CustomUser fields = ['username', 'email', 'password', 'password1'] def clean_email(self): email = self.cleaned_data['email'] registered_email = CustomUser.objects.all() if email != registered_email: raise ValidationError('このメールアドレスは既に登録されています。他のメールアドレスを使用してください') return password def clean_password(self): password = self.cleaned_data['password'] password1 = self.data.get('password1') if password != password1: self.add_error('password1', 'パスワードが一致しません。正しいパスワードを入力してください。') raise ValidationError('パスワードが一致しません。正しいパスワードを入力してください。') return password class HealthDataForm(forms.ModelForm): reason = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder':'今日の、できごとや気持ち'})) action = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder':'明日に向けての、姿勢や行動'})) class Meta: model = Linguistic_HealthData fields = ['condition', 'reason', 'action', 'message']

signup_1.html(フォームのテンプレート)

signup_1.html

models.py

models.py

from django.db import models from django.contrib.auth.models import PermissionsMixin from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager from django.core.mail import send_mail from django.utils import timezone from django.contrib.auth.validators import UnicodeUsernameValidator from django.utils.translation import gettext_lazy as _ class UserManager(BaseUserManager): use_in_migrations = True def _create_user(self, username, email, password, **extra_fields): if not email: raise ValueError('Emailを入力して下さい') email = self.normalize_email(email) username = self.model.normalize_username(username) user = self.model(username=username, email=email, **extra_fields) user.set_password(password) user.save(using=self.db) return user def create_user(self, username, email, password=None, **extra_fields): extra_fields.setdefault('is_staff', False) extra_fields.setdefault('is_superuser', False) return self._create_user(email, password, **extra_fields) def create_superuser(self, username, email, password, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) if extra_fields.get('is_staff') is not True: raise ValueError('is_staff=Trueである必要があります。') if extra_fields.get('is_superuser') is not True: raise ValueError('is_superuser=Trueである必要があります。') return self._create_user(username, email, password, **extra_fields) class CustomUser(AbstractBaseUser, PermissionsMixin): username_validator = UnicodeUsernameValidator() username = models.CharField(_("username"), max_length=50, validators=[username_validator], blank=True) email = models.EmailField(_("email_address"), unique=True) password = models.CharField(_("password"), max_length=200, unique=True) password1 = models.CharField(_("password1"), max_length=200, unique=True) is_staff = models.BooleanField(_("staff status"), default=False) is_active = models.BooleanField(_("active"), default=True) date_joined = models.DateTimeField(_("date joined"), default=timezone.now) objects = UserManager() USERNAME_FIELD = "email" EMAIL_FIELD = "email" REQUIRED_FIELDS = ['username'] class Linguistic_HealthData(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=False, verbose_name='user') date = models.DateTimeField(default=timezone.now, null=False, verbose_name='date') condition = models.IntegerField(null=False, verbose_name='condition') reason = models.CharField(max_length=255, null=False, verbose_name='reason') action = models.CharField(max_length=255, null=False, verbose_name='action') message = models.CharField(max_length=255, null=False, verbose_name='message')

【関連ファイル】
views.py(class SignUpForm(CreateView)部分)

views.py

from django.shortcuts import render from django.views.generic import CreateView from django.urls import reverse_lazy from .forms import SignUpForm, HealthDataForm def introduce_1(request): return render(request, 'introduce_1.html') def introduce_2(request): return render(request, 'introduce_2.html') def introduce_3(request): return render(request, 'introduce_3.html') class SignUpForm(CreateView): form_class = SignUpForm template_name = 'signup_1.html' success_url = reverse_lazy('signup_2.html') ''' def form_valid(self, form): response = super().form_valid(form) username = form.cleaned_data.get('username') email = form.cleaned_data.get('email') password = form.cleaned_data.get('password') user = authenticate(username=username, password=password) login(self.request, user) return response ''' def signup_1(request): return render(request, 'signup_1.html') def signup_2(request): return render(request, 'signup_2.html') def splash(request): return render(request, 'splash.html') class home(CreateView): form_class = HealthDataForm template_name = 'home.html' success_url = reverse_lazy('home1.html') class home1(CreateView): form_class = HealthDataForm template_name = 'home1.html' success_url = reverse_lazy('home2.html') class home2(CreateView): form_class = HealthDataForm template_name = 'home2.html' success_url = reverse_lazy('home.html') class home4(CreateView): form_class = HealthDataForm template_name = 'home4.html' success_url = reverse_lazy('home.html') def post(self, request, *args, **kwargs): user = self.request.user

コメントを投稿

0 コメント