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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2155閲覧

【Django】ユーザー登録フォームに入力したメールアドレスが既に登録されていた場合に、エラーメッセージを表示させたい

kakeru0225

総合スコア37

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/07/01 06:37

編集2022/07/03 01:59

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

<解決したい問題>
【概要】
ユーザー登録フォームに入力したメールアドレスが既に登録されていた場合に、エラーメッセージを表示させる方法
【詳細】
emailフィールドをunique=Trueで設定しており、(おそらくDjangoのデフォルト機能で)重複したメールアドレスは登録できないようには既になっている。
ただ、現状の登録失敗の動作としてはフォームに入力したパスワードがクリアされるだけでエラーメッセージが表示されるわけではないので、登録失敗後にエラーメッセージを表示させたい。

<お伺いしたいこと>
forms.py内におけるメールアドレスが既に登録されていた場合の例外処理の書き方
テンプレートにおける、エラーメッセージを表示される処理の書き方


<現状の理解>
①入力フォームの「パスワード」「パスワード確認用」欄では、これらの双方が一致しない場合は登録を拒否し、エラーメッセージを表示させることはできている
②「データ前処理後」のデータを self.cleaned_data["email"] で受け取り、それとモデル内のデータが一致した場合にエラーを返す、という導線も何となく理解できている。

<不明点>
具体的なデータの照合方法とその結果によるエラーメッセージの表示方法が分からない

私自身が初学者であり、上記認識が誤っている(パスワードのバリデーションも実装はできましたが、とりあえずの実装を優先させたため完全に理解できておりません)等あるかもしれませんが、上記内容に関してご教示頂けますと幸いです。


<ソースコード>

forms.py

forms.py

1from django import forms 2from toppage.models import CustomUser 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 #labels = {'username':"ユーザー名",'email':"メールアドレス",'password':"パスワード"} 14 15 16 def clean_password(self): 17 password = self.cleaned_data['password'] 18 password1 = self.data.get('password1') 19 if password != password1: 20 self.add_error('password1', 'パスワードが一致しません。正しいパスワードを入力してください。') 21 raise ValidationError('パスワードが一致しません。正しいパスワードを入力してください。') 22 return password 23

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

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

signup_1.html

views.py

views.py

1from django.shortcuts import render 2from django.views.generic import CreateView 3from django.urls import reverse_lazy 4from .forms import SignUpForm 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') 20 21def signup_1(request): 22 return render(request, 'signup_1.html') 23 24def signup_2(request): 25 return render(request, 'signup_2.html') 26 27def splash(request): 28 return render(request, 'splash.html') 29

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

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

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

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

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

guest

回答1

0

ベストアンサー

forms.pyで記述した例外はform.errorsに格納されますので、ユーザー登録フォームで表示させてあげれば良いかと思います。

template

1{% if form.errors %} 2<ul> 3 {% for error in form.non_field_errors %} 4 <li>{{ error }}</li> 5 {% endfor %} 6</ul> 7{% endif %}

投稿2022/07/01 20:24

harakazu

総合スコア150

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

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

kakeru0225

2022/07/03 02:20

お忙しい中ご回答いただき有難うございます!いつもお世話になっております。 ご教示頂いた内容を踏まえ、改めて整理がつきましたのでご共有させて頂きます(上記の説明が足らずすみません) <不明点> ①forms.pyでの、メールアドレスが重複した場合の例外処理の記述方法 →例外処理を記述していない状態でも、重複したemaliデータは登録できないようになっております。 ②テンプレートにおけるエラーメッセージ表示の記述方法 <お伺いしたいこと> ①(おそらく)Djangoのデフォルトの機能で重複したemaliデータは登録できないようになっている場合、それをどのようにテンプレート内でエラーメッセージを表示させればよいか ②現状の例外処理はあくまでDjangoにデフォルトで備わっている機能でエラーメッセージの表示ができない場合、どのようにforms.py内に例外処理を書けばよいか(フォームに入力されたemailとDB内にあるemailの重複を調べ重複があった場合にエラーを表示させる、という処理をいろいろと調べましたが現時点で理解ができておりません) ③上記の②の場合のテンプレート内におけるエラーメッセージの表示方法 一度頂いた内容をもとにい試行錯誤をしてみましたが、問題を解決することができませんでした。 お時間ある際で構いませんので、上記に関してご教示頂けますと幸いでございます。 ※forms.pyの内容を一部更新し、テンプレートを新規に追加いたしまいた。
harakazu

2022/07/03 02:43

forms.pyのclean_password関数と同列に、clean_email関数を定義して、そこで例外を発生するようにしてみてはいかがでしょうか? ここで設定した内容がテンプレート側でform.errorsで取得できると思います。 def clean_email(self): email = self.cleaned_data['email'] if User.objects.filter(email=email).exists(): raise ValidationError("既に登録されています。") return email
kakeru0225

2022/07/12 10:03

上記ご教示頂き有難うございます! 無事に動作いたしまいた!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問