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

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

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

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

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

HTML

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

Q&A

解決済

1回答

511閲覧

【Python / Django】ユーザー新規登録フォームにて、自身が設定していない例外処理を無効にしたい

kakeru0225

総合スコア37

Django

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

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

HTML

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

0グッド

1クリップ

投稿2022/08/01 17:29

前提

Djangoを用いて、ユーザー新規登録機能を実装しています。
実際に新規登録をしてみると、設定をしていないパスワードの例外処理が起動し英語でのエラーメッセージが出てしまい、既に登録しているパスワードが登録できないようになってしまいました。
イメージ説明

実現したいこと

  • 自身が設定していない上記のパスワードの例外処理を無効にしたい。

(自身で設定した例外処理はそのままの残したいと考えております。)

該当のソースコード

forms.py

python

1from django import forms 2from ueru_app.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 if CustomUser.objects.filter(email=email).exists(): 17 raise ValidationError("このメールアドレスは既に登録されています。他のメールアドレスを使用してください。") 18 return email 19 20 def clean_password(self): 21 password = self.cleaned_data['password'] 22 password1 = self.data.get('password1') 23 if password != password1: 24 self.add_error('password1', 'パスワードが一致しません。正しいパスワードを入力してください。') 25 raise ValidationError('パスワードが一致しません。正しいパスワードを入力してください。') 26 return password 27 28class HealthDataForm(forms.ModelForm): 29 reason = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder':'今日の、できごとや気持ち'})) 30 action = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder':'明日に向けての、姿勢や行動'})) 31 class Meta: 32 model = Linguistic_HealthData 33 fields = ['condition', 'reason', 'action', 'message']

models.py

python

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')

signup_1.html(フォームを表示させるテンプレート)

html

1{% load static %} 2{% load widget_tweaks %} 3{{ form.title.errors }} 4 5<!DOCTYPE html> 6<html lang="ja"> 7 8 <head> 9 <meta charset="UTF-8"> 10 <title>アカウント作成</title> 11 <link rel="stylesheet" href="{% static 'css/ueru_app/signup_1.css' %}"> 12 </head> 13 14 <header> 15 <h2 class="title">アカウントのセットアップ</h2> 16 <p class="description">新しいアカウントを作成しよう</p> 17 </header> 18 19 <body> 20 <form method='POST' class='form'> 21 {% csrf_token %} 22 <p>ユーザー名</p> 23 <br>{{ form.username | add_class:"form-control" }} 24 <p>メールアドレス</p> 25 <br>{{ form.email | add_class:"form-control" }} 26 <p>パスワード</p> 27 <br>{{ form.password | add_class:"form-control"}} 28 <p>パスワード確認用</p> 29 <br>{{ form.password1 | add_class:"form-control"}} 30 31 {% if form.errors %} 32 <ul class="error_message"> 33 {% for error in form.email.errors %} 34 <li>{{ error }}</li> 35 {% endfor %} 36 </ul> 37 {% endif %} 38 39 {% if form.errors %} 40 <ul class="error_message"> 41 {% for error in form.password1.errors %} 42 <li>{{ error }}</li> 43 {% endfor %} 44 </ul> 45 {% endif %} 46 47 <input type='submit' value='登録する' class="submit-bottun"> 48 </form> 49 </body> 50 51 52 <footer> 53 </footer> 54 55 56</html>

試したこと

  • Djangoに備わっているデフォルトの例外処理が存在するのか、および存在した場合の解決方法を探す

→該当するものを発見できず

  • 自身が設定した例外処理が誤っている可能性を検証

→新規登録も自身が実装した例外処理も正常にできており、今回の設定していないパスワードの例外処理以外は全て正常に機能することを確認

今回のエラーが起こってしまう要因の特定とその解決策の双方を把握できておらず、表題の件に関しましてご教示頂けますと幸いでございます。

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

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

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

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

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

guest

回答1

0

自己解決

Djangoのデフォルトの例外処理でもなく、forms.pyに原因があるのでもなく、models.pyに原因がありました。

password = models.CharField(_("password"), max_length=200, unique=True) password1 = models.CharField(_("password1"), max_length=200, unique=True)

のunique=Trueを削除し、DBを再作成したところ正常に動作致しました。

投稿2022/08/01 18:21

kakeru0225

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問