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時間ほどいろいろ試行錯誤したのですが、解決しませんでした。わかる方ぜひご教示いただきたいです。。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。