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

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

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

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

Model

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Python

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

Q&A

解決済

1回答

2541閲覧

【Djagno】validate_passwordのバリデーションエラーを表示できない

y_____

総合スコア3

Django

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

Model

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Python

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

0グッド

0クリップ

投稿2021/08/17 13:42

編集2021/10/03 06:13

Djangoのバージョンは3.2.2.を使用。

カスタムユーザーモデルでユーザーモデルを作成していますが、パスワードが適切でない場合にValidationErrorになります。(下記の【発生しているエラー】参照)
メールアドレスが適切でない場合はエラーメッセージが正常に表示される(下記の【解決イメージ】参照)のですが、パスワードの場合だけエラーになります。
【発生しているエラー】
イメージ説明

【解決イメージ】
イメージ説明

どうすれば【解決イメージ】のようにエラーメッセージを表示させることができますでしょうか?

【書いているコード】

model

1from django.db import models 2from django.contrib.auth.models import ( 3 BaseUserManager, AbstractBaseUser, PermissionsMixin 4) 5from django.urls import reverse_lazy 6from django.utils import timezone 7from django.contrib.auth import login, authenticate 8import django.contrib.auth.password_validation as validators 9from django.core.exceptions import ValidationError 10# Create your models here. 11 12class UserManager(BaseUserManager): 13 def create_user(self, username, email, password=None): 14 if not email: 15 raise ValueError('Enter Email') 16 user = self.model( 17 username=username, 18 email=email 19 ) 20 user.set_password(password) 21 user.save(using=self._db) 22 user = authenticate(username=username, password=password) 23 login(self.request, user) 24 return user 25 26 def create_superuser(self, username, email, password=None): 27 user = self.model( 28 username=username, 29 email=email, 30 ) 31 user.set_password(password) 32 user.is_staff = True 33 user.is_active = True 34 user.is_superuser = True 35 user.save(using=self._db) 36 return user 37 38class Users(AbstractBaseUser, PermissionsMixin): 39 # AbstractBaseUserにPasswordフィールドがある 40 # PermissionsMixinにSupercreateuserフィールドがある 41 username = models.CharField(max_length=150) 42 email = models.EmailField(max_length=255, unique=True) 43 is_active = models.BooleanField(default=True) 44 is_staff = models.BooleanField(default=False) 45 stripe_account = models.BooleanField(default=False) 46 stripe_account_id = models.CharField(max_length=150, null=True, blank=True) 47 48 USERNAME_FIELD = 'email' #このテーブルのレコードを一意に設定する 49 REQUIRED_FIELDS = ['username'] #スーパーユーザ作成時に入力するフィールド 50 51 objects = UserManager() 52 53 def get_absolute_url(self): 54 return reverse_lazy('accounts:home') 55

forms

1from datetime import datetime 2from django import forms 3from django.forms.widgets import PasswordInput, Textarea 4from .models import ( 5 Users 6) 7from stores.models import ( 8 Stores, StoreCategories, MenuCategories, Menus 9) 10from django.contrib.auth.password_validation import validate_password 11from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm 12from django.core.exceptions import ValidationError 13import django.contrib.auth.password_validation as validators 14 15class SignupForm(forms.ModelForm): 16 username = forms.CharField(label='名前') 17 email = forms.EmailField(label='メールアドレス') 18 password = forms.CharField(label='パスワード', widget=forms.PasswordInput()) 19 confirm_password = forms.CharField(label='パスワード再入力', widget=forms.PasswordInput()) 20 21 class Meta: 22 model = Users 23 fields = ['username', 'email', 'password'] 24 25 def clean(self): 26 cleaned_data = super().clean() 27 password = cleaned_data.get('password') 28 confirm_password = cleaned_data.get('confirm_password') 29 if password != confirm_password: 30 raise ValidationError('パスワードが一致しません') 31

views

1"""サインアップ""" 2class SignupView(CreateView): 3 template_name = "accounts/signup.html" 4 5 model = Users 6 form_class = SignupForm 7 success_url = reverse_lazy('stores:create_mystore')

html

1<main class="text-center"> 2 <h1 class="h3 mb-3 fw-normal">新規登録</h1> 3 <form method="POST"> 4 {% csrf_token %} 5 6 {{ form.as_p }} 7 <div class="checkbox mb-3"> 8 </div> 9 <input class="w-100 btn btn-lg btn-primary" type="submit" value="登録"> 10 </form> 11</main>

【試したこと】
関数ベースビューで試したりしたが結果は変わりませんでした。。。

views

1def signup(request): 2 form = SignupForm(request.POST) 3 if form.is_valid(): 4 user = form.save(commit=False) 5 try: 6 validate_password(form.cleaned_data.get('password'), user) 7 except ValidationError as e: 8 form.add_error('password', e) 9 return render(request, 'accounts/signup.html', context={ 10 'form': form, 11 }) 12 13 user.set_password(user.password) 14 user.save() #ユーザーを保存 15 return render(request, 'stores/mystore/dashboards/mystore.html', context={ 16 'form': form, 17 })

3時間ほどいろいろ試行錯誤したのですが、解決しませんでした。わかる方ぜひご教示いただきたいです。。。

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

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

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

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

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

guest

回答1

0

自己解決

モデルのsaveメソッドでvalidate_passwordをかけているのが原因でした。
saveメソッドではバリデーションエラーをformエラーメッセージに渡せないみたいです。

models

1 def save(self, commit=False): 2 user = super().save(commit=False) 3 validate_password(self.cleaned_data['password'], user) 4 user.set_password(self.cleaned_data['password']) 5 user.save() 6 return user

cleanメソッドでvalidate_passwordをかければ解決しました。

参考記事
forms - Django、テンプレートにValidationErrorを表示

投稿2021/10/03 06:59

y_____

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問