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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4113閲覧

django 登録したアカウントにログインできない。

atk_721

総合スコア62

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/10/18 21:58

前提・実現したいこと

送られてきたメールにアクセスする事で本登録が完了する。
会員登録を実装したのですが、本登録までしていざログインすると、
ログインできないのですが、知恵を貸してください。

登録したユーザーはデータベースにはしっかり登録されているので、
おそらくパスワードに異常があります。
どこをどの様に手を加えればに解決するでしょうか?
userの入力したパスワードを確認する方法はないのでしょうか?

表示されるエラー:アドレスは間違いない

正しいメールアドレスとパスワードを入力してください。どちらのフィールドも大文字と小文字は区別されます。

views.py

from django.shortcuts import render from django.views import generic from .models import * from django.contrib.auth.views import LoginView from .forms import LoginForm,SignUPForm from django.contrib.sites.shortcuts import get_current_site from django.core.signing import dumps,SignatureExpired,BadSignature,loads from django.template.loader import get_template from django.contrib import messages from django.http import HttpResponseRedirect,HttpResponseBadRequest from django.urls import reverse from django.conf import settings # Create your views here. class Lp(generic.TemplateView): template_name = 'ec/lp.html' def get_context_data(self,**kwargs): context = super().get_context_data() context = { 'items':Product.objects.all(), } return context class ItemList(generic.ListView): model = Product template_name = 'ec/item_list.html' def get_queryset(self): queryset = Product.objects.all() if "keyword" in self.request.GET and self.request.GET['keyword'] != None: keyword = self.request.GET['keyword'] queryset = Product.objects.filter(name__icontains=keyword) return queryset class ItemDetail(generic.DetailView): model = Product template_name = 'ec/item_detail.html' class Login(LoginView): form_class = LoginForm template_name = 'ec/login.html' class SignUp(generic.CreateView): template_name = 'ec/signup.html' model = User form_class = SignUPForm def form_valid(self,form): user = form.save(commit=False) user.is_active = False user.save() current_site = get_current_site(self.request) domain = current_site.domain context = { 'protocol':self.request.scheme, 'domain':domain, 'token':dumps(user.pk), 'user':user, } subject_template = get_template('ec/mail_template/signup/subject.txt') subject = subject_template.render(context).strip()#これがないとBudHeadErrorになる。改行を削除。 message_template = get_template('ec/mail_template/signup/message.txt') message = message_template.render(context) user.email_user(subject,message) messages.success(self.request,'本登録用のリンクを送付しました。') return HttpResponseRedirect(reverse('ec:signup')) class SignUpDone(generic.TemplateView): template_name = 'ec/signup_done.html' timeout_seconds = getattr(settings,'ACTIVATION_TIMEOUT_SECONDS',60*60*24) def get(self,request,**kwargs): token = kwargs.get('token') try: user_pk = loads(token,max_age=self.timeout_seconds) except SignatureExpired: return HttpResponseBadRequest() except BadSignature: return HttpResponseBadRequest() else: try: user = User.objects.get(pk=user_pk) except User.DoesNotExist: return HttpResponseBadRequest() else: if not user.is_active: user.active = True user.save() return super().get(request,**kwargs) return HttpResponseBadRequest()

models.py

from django.db import models from django.contrib.auth.base_user import BaseUserManager,AbstractBaseUser from django.contrib.auth.models import PermissionsMixin from django.core.mail import send_mail from django.utils.translation import ugettext_lazy as _ from django.utils import timezone # Create your models here. class Product(models.Model): class Meta: db_table = 'product' verbose_name ='商品' verbose_name_plural = '商品' thumbnail = models.ImageField(verbose_name='商品画像',upload_to='thumbnails/') name = models.CharField(verbose_name='名前',max_length=255,blank=False,null=False) price = models.IntegerField(verbose_name='価格') description = models.TextField(verbose_name='商品説明') class MyUserManager(BaseUserManager): use_in_migrations = True #"""ユーザーマネージャー.""" def _create_user(self,email,password,**extra_fields): #"""メールアドレスでの登録を必須にする""" if not email: raise ValueError('The given imail must be set') user = self.model(email=email, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_user(self,email,password=None,**extra_fields): #"""is_staff(管理サイトにログインできるか)と、is_superuer(全ての権限)をFalseに""" extra_fields.setdefault('is_staff',False) extra_fields.setdefault('is_superuser',False) return self._create_user(email,password,**extra_fields) def create_superuser(self,email,password,**extra_fields): #"""スーパーユーザーは、is_staffとis_superuserをTrueに""" extra_fields.setdefault('is_staff',True) extra_fields.setdefault('is_superuser',True) if extra_fields.get('is_staff') is not True: raise ValueError('superuser must have is_staff=True.') if extra_fields.get('is_superuser') is not True: raise ValueError('superuser must have is_superuser=True.') return self._create_user(email,password,**extra_fields) class User(AbstractBaseUser, PermissionsMixin): class Meta: verbose_name = 'ユーザー' verbose_name_plural = 'ユーザー' #"""カスタムユーザーモデル.""" email = models.EmailField('メールアドレス',max_length=150,null=False,blank=False,unique=True) name = models.CharField('名前',max_length=150,null=False,blank=False) is_staff = models.BooleanField( '管理者', default = False, help_text=_( 'Designates whether the user can log into this admin site.'), ) is_active = models.BooleanField( '有効', default=True, help_text=_( 'Designates whether this user should be treated as active. ' 'Unselect this instead of deleting accounts.' ), ) date_joined = models.DateTimeField(_('date joined'),default=timezone.now) objects = MyUserManager() EMAIL_FIELD = 'email' USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['name'] def email_user(self,subject,message,from_email=None,**kwargs): #"""Send an email to this user.""" send_mail(subject,message,from_email,[self.email],**kwargs) @property def username(self): """username属性のゲッター 他アプリケーションが、username属性にアクセスした場合に備えて定義 メールアドレスを返す """ return self.email

forms.py

from django import forms from django.contrib.auth import get_user_model from django.contrib.auth.forms import AuthenticationForm,UserCreationForm from .models import * from django.core.exceptions import ValidationError class LoginForm(AuthenticationForm): def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) for field in self.fields.values(): field.widget.attrs['class'] = 'form-control' field.widget.attrs['placeholder'] = field.label class SignUPForm(UserCreationForm): class Meta: model = User fields = ('email','name') def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) for field in self.fields.values(): field.widget.attrs['class'] = 'form-control' field.widget.attrs['placeholder'] = field.label

補足情報(FW/ツールのバージョンなど)

python3.7.3
django2.2

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

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

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

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

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

guest

回答1

0

自己解決

views.py

def get(self,request,**kwargs): token = kwargs.get('token') try: user_pk = loads(token,max_age=self.timeout_seconds) except SignatureExpired: return HttpResponseBadRequest() except BadSignature: return HttpResponseBadRequest() else: try: user = User.objects.get(pk=user_pk) except User.DoesNotExist: return HttpResponseBadRequest() else: if not user.is_active: user.active = True user.save() return super().get(request,**kwargs) return HttpResponseBadRequest()

単純に、user.active = Trueではなく、user.is_active = True でした。

投稿2019/10/19 17:58

atk_721

総合スコア62

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問