前提・実現したいこと
djangoで新規ユーザー登録を実装しています。
新規登録後に、ログインを行いトップ画面に遷移させたいのですが、下記のエラーがでてしまいます。
発生している問題・エラーメッセージ
django
1AttributeError at /signup/ 2'AnonymousUser' object has no attribute '_meta'
該当のソースコード
view.pyはこれです。
python3
1def signup(request): 2 if request.method == 'POST': 3 form = UserCreationForm(request.POST) 4 if form.is_valid(): 5 form.save() 6 username = form.cleaned_data['username'] 7 password = form.cleaned_data['password1'] 8 user = authenticate(username=username, password=password)# フォームの入力値で認証できればユーザーオブジェクト、できなければNoneを返す 9 login(request, user, backend='django.contrib.auth.backends.ModelBackend') 10 return redirect('polls:index') 11 12 else: 13 form = UserCreationForm() 14 return render(request, 'polls/signup.html', {'form': form})
form.py
python3
1 2class UserCreationForm(forms.ModelForm): 3 password1 = forms.CharField(label='Password', widget=forms.PasswordInput) 4 password2 = forms.CharField( 5 label='Password confirmation', widget=forms.PasswordInput) 6 7 class Meta: 8 model = User 9 fields = ('email', 'username') 10 11 def clean_password2(self): 12 password1 = self.cleaned_data.get("password1") 13 password2 = self.cleaned_data.get("password2") 14 if password1 and password2 and password1 != password2: 15 raise forms.ValidationError("Passwords don't match") 16 return password2 17 18 def save(self, commit=True): 19 user = super().save(commit=False) 20 user.set_password(self.cleaned_data["password1"]) 21 if commit: 22 user.save() 23 return user 24 25 26class UserChangeForm(forms.ModelForm): 27 password = ReadOnlyPasswordHashField() 28 29 class Meta: 30 model = User 31 fields = ('email', 'password', 'username','profile','prof_img','cover_img') 32 33 def clean_password(self): 34 return self.initial["password"]
model.py
python3
1class UserManager(BaseUserManager): 2 def create_user(self, username, email, password=None): 3 if not username: 4 raise ValueError('Users must have an username') 5 6 user = self.model( 7 username=username, 8 email=self.normalize_email(email), 9 ) 10 11 user.set_password(password) 12 user.save(using=self._db) 13 return user 14 15 def create_superuser(self, username, email, password): 16 user = self.create_user( 17 username=username, 18 email=self.normalize_email(email), 19 password=password, 20 ) 21 user.is_admin = True 22 user.is_staff = True 23 user.is_superuser = True 24 user.save(using=self._db) 25 return user 26 27 28class User(AbstractBaseUser): 29 username_validator = UnicodeUsernameValidator() 30 username = models.CharField( 31 _('username'), 32 max_length=150, 33 unique=True, 34 help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), 35 validators=[username_validator], 36 error_messages={ 37 'unique': _("A user with that username already exists."), 38 }, 39 ) 40 email = models.EmailField( 41 verbose_name='email', 42 max_length=255, 43 unique=True, 44 ) 45 profile = models.CharField(max_length=200, blank=True) 46 prof_img = models.ImageField(upload_to='prof_img',verbose_name='プロフィール画像',blank=True) 47 cover_img = models.ImageField(upload_to='cover_img',verbose_name='背景画像',blank=True) 48 49 is_active = models.BooleanField(default=True) 50 is_admin = models.BooleanField(default=False) 51 date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 52 53 objects = UserManager() 54 55 EMAIL_FIELD = 'email' 56 USERNAME_FIELD = 'username' 57 REQUIRED_FIELDS = [] 58 59 def __str__(self): 60 return self.username 61 62 def has_perm(self, perm, obj=None): 63 return True 64 65 def has_module_perms(self, app_label): 66 return True 67 68 @property 69 def is_staff(self): 70 return self.is_admin 71
試したこと
うまく動作していない場所としては、Viewの
user = authenticate(username=username, password=password)
で、Noneがかえされているのが原因だとは、特定できたのですが、なぜNONEで返されるのかが理解できていません。
なお、ユーザーネーム、パスワードは正常に登録されていることは確認できています。
他に足りない情報がございましたらご指摘くださいますようお願いいたします。
補足情報(FW/ツールのバージョンなど)
Django==2.1.5
あなたの回答
tips
プレビュー