質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

469閲覧

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

kakeru0225

総合スコア37

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2022/07/11 09:43

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

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

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

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


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

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

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


<ソースコード>

【該当ファイル】

foms.py

foms.py

1from django import forms 2from toppage.models import CustomUser, Linguistic_HealthData 3from django.core.exceptions import ValidationError 4 5 6class SignUpForm(forms.ModelForm): 7 password = forms.CharField(max_length=20, widget=forms.PasswordInput()) 8 password1 = forms.CharField(max_length=20, widget=forms.PasswordInput()) 9 10 class Meta: 11 model = CustomUser 12 fields = ['username', 'email', 'password', 'password1'] 13 14 def clean_email(self): 15 email = self.cleaned_data['email'] 16 registered_email = CustomUser.objects.all() 17 if email != registered_email: 18 raise ValidationError('このメールアドレスは既に登録されています。他のメールアドレスを使用してください') 19 return password 20 21 def clean_password(self): 22 password = self.cleaned_data['password'] 23 password1 = self.data.get('password1') 24 if password != password1: 25 self.add_error('password1', 'パスワードが一致しません。正しいパスワードを入力してください。') 26 raise ValidationError('パスワードが一致しません。正しいパスワードを入力してください。') 27 return password 28 29class HealthDataForm(forms.ModelForm): 30 reason = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder':'今日の、できごとや気持ち'})) 31 action = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder':'明日に向けての、姿勢や行動'})) 32 class Meta: 33 model = Linguistic_HealthData 34 fields = ['condition', 'reason', 'action', 'message']

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

signup_1.html

models.py

models.py

1from django.db import models 2from django.contrib.auth.models import PermissionsMixin 3from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager 4from django.core.mail import send_mail 5from django.utils import timezone 6from django.contrib.auth.validators import UnicodeUsernameValidator 7from django.utils.translation import gettext_lazy as _ 8 9 10class UserManager(BaseUserManager): 11 use_in_migrations = True 12 13 def _create_user(self, username, email, password, **extra_fields): 14 if not email: 15 raise ValueError('Emailを入力して下さい') 16 email = self.normalize_email(email) 17 username = self.model.normalize_username(username) 18 user = self.model(username=username, email=email, **extra_fields) 19 user.set_password(password) 20 user.save(using=self.db) 21 return user 22 def create_user(self, username, email, password=None, **extra_fields): 23 extra_fields.setdefault('is_staff', False) 24 extra_fields.setdefault('is_superuser', False) 25 return self._create_user(email, password, **extra_fields) 26 27 def create_superuser(self, username, email, password, **extra_fields): 28 extra_fields.setdefault('is_staff', True) 29 extra_fields.setdefault('is_superuser', True) 30 if extra_fields.get('is_staff') is not True: 31 raise ValueError('is_staff=Trueである必要があります。') 32 if extra_fields.get('is_superuser') is not True: 33 raise ValueError('is_superuser=Trueである必要があります。') 34 return self._create_user(username, email, password, **extra_fields) 35 36 37class CustomUser(AbstractBaseUser, PermissionsMixin): 38 username_validator = UnicodeUsernameValidator() 39 40 username = models.CharField(_("username"), max_length=50, validators=[username_validator], blank=True) 41 email = models.EmailField(_("email_address"), unique=True) 42 password = models.CharField(_("password"), max_length=200, unique=True) 43 password1 = models.CharField(_("password1"), max_length=200, unique=True) 44 is_staff = models.BooleanField(_("staff status"), default=False) 45 is_active = models.BooleanField(_("active"), default=True) 46 date_joined = models.DateTimeField(_("date joined"), default=timezone.now) 47 48 objects = UserManager() 49 USERNAME_FIELD = "email" 50 EMAIL_FIELD = "email" 51 REQUIRED_FIELDS = ['username'] 52 53 54class Linguistic_HealthData(models.Model): 55 56 user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=False, verbose_name='user') 57 date = models.DateTimeField(default=timezone.now, null=False, verbose_name='date') 58 condition = models.IntegerField(null=False, verbose_name='condition') 59 reason = models.CharField(max_length=255, null=False, verbose_name='reason') 60 action = models.CharField(max_length=255, null=False, verbose_name='action') 61 message = models.CharField(max_length=255, null=False, verbose_name='message')

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

views.py

1from django.shortcuts import render 2from django.views.generic import CreateView 3from django.urls import reverse_lazy 4from .forms import SignUpForm, HealthDataForm 5 6 7def introduce_1(request): 8 return render(request, 'introduce_1.html') 9 10def introduce_2(request): 11 return render(request, 'introduce_2.html') 12 13def introduce_3(request): 14 return render(request, 'introduce_3.html') 15 16class SignUpForm(CreateView): 17 form_class = SignUpForm 18 template_name = 'signup_1.html' 19 success_url = reverse_lazy('signup_2.html') 20 21 ''' 22 def form_valid(self, form): 23 response = super().form_valid(form) 24 username = form.cleaned_data.get('username') 25 email = form.cleaned_data.get('email') 26 password = form.cleaned_data.get('password') 27 user = authenticate(username=username, password=password) 28 login(self.request, user) 29 return response 30 ''' 31 32def signup_1(request): 33 return render(request, 'signup_1.html') 34 35def signup_2(request): 36 return render(request, 'signup_2.html') 37 38def splash(request): 39 return render(request, 'splash.html') 40 41class home(CreateView): 42 form_class = HealthDataForm 43 template_name = 'home.html' 44 success_url = reverse_lazy('home1.html') 45 46class home1(CreateView): 47 form_class = HealthDataForm 48 template_name = 'home1.html' 49 success_url = reverse_lazy('home2.html') 50 51class home2(CreateView): 52 form_class = HealthDataForm 53 template_name = 'home2.html' 54 success_url = reverse_lazy('home.html') 55 56class home4(CreateView): 57 form_class = HealthDataForm 58 template_name = 'home4.html' 59 success_url = reverse_lazy('home.html') 60 61 def post(self, request, *args, **kwargs): 62 user = self.request.user

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

email = self.cleaned_data['email'] registered_email = CustomUser.objects.all() if email != registered_email:

なので このifは常に真になります。よって常に例外が発生します。

投稿2022/07/11 11:16

tatamyiwathy

総合スコア1039

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakeru0225

2022/07/12 09:16

お忙しい中ご回答いただき有難うございます! 頂いた内容を理解し、半日ほどかけて下記二点の内容を試してみましたが、うまく解決することができませんでした。 ①上記のif分の変更(一行目の email = self.cleaned_data['email']部分を入力したデータだと考えていたが、これはデータ前処理後のデータで既に登録済みの為、登録前のデータを取得する必要があると現時点では理化しています) ②Djangoのデフォルトの重複機能を用いて、日本語のエラーを表示する(デフォルトでは英語の為) おそらく上記だと①のアプローチが妥当だと考えていますが、 色々と調べてみても分からず、どのように検索したらよいかご教示頂くことは可能でしょうか、、??
kakeru0225

2022/07/12 10:05

下記のコードで解決いたしました! 上記内容に関してご教示頂き有難うございます。とても勉強になりました! def clean_email(self): email = self.cleaned_data['email'] if User.objects.filter(email=email).exists(): raise ValidationError("既に登録されています。") return email
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問