coltonOP
@coltonOP (こるとんくん)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Django、作ったアカウントにログインできない

解決したいこと

テスト用に作ったアカウントでパスワードがあっているのにログインできません。
なぜでしょうか?このアカウントはDjangoの管理画面で直接データ追加をして作ったものです。
バージョンは4.1です。

ちなみに1番最初にTerminalで作ったsuperuserではログインできました。

situmonpng.png

管理画面でアカウントを作る際、パスワード確認用の欄がないのですが、これがいけないのでしょうか?

ちなみにログイン機能とユーザーマスタはAbstractBaseUserを使ってカスタムユーザーを作っています。

作り方に問題があるのでしょうか? Teminalで作ったユーザーではログインできるのですが、管理用画面から直接作ったユーザーは無効になってしまうのでしょうか?

models.py

import datetime
from django.db import models
from django.contrib import auth
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.core.mail import send_mail
from django.contrib.auth.hashers import make_password
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import PermissionsMixin

from django.utils import timezone

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """
        Create and save a user with the given email and password.
        """
        if not email:
            raise ValueError("The given email must be set")
        email = self.normalize_email(email)
       
        user = self.model(email=email, **extra_fields)
        user.password = make_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email=None, password=None, **extra_fields):
        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=None, password=None, **extra_fields):
        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)

    def with_perm(
        self, perm, is_active=True, include_superusers=True, backend=None, obj=None
    ):
        if backend is None:
            backends = auth._get_backends(return_tuples=True)
            if len(backends) == 1:
                backend, _ = backends[0]
            else:
                raise ValueError(
                    "You have multiple authentication backends configured and "
                    "therefore must provide the `backend` argument."
                )
        elif not isinstance(backend, str):
            raise TypeError(
                "backend must be a dotted import path string (got %r)." % backend
            )
        else:
            backend = auth.load_backend(backend)
        if hasattr(backend, "with_perm"):
            return backend.with_perm(
                perm,
                is_active=is_active,
                include_superusers=include_superusers,
                obj=obj,
            )
        return self.none()

class SyainMaster(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(_("email address"), unique=True)
    
    code = models.CharField(max_length=4)
    
    name = models.CharField(max_length=16)
    
    post = models.IntegerField()
    
    belong = models.CharField(max_length=4)
    
    
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    
    
    is_staff = models.BooleanField(
        _("staff status"),
        default=False,
        help_text=_("Designates whether the user can log into this admin site."),
    )

    objects = UserManager()

    EMAIL_FIELD = "email"
    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["code","name","post","belong"]

    class Meta:
        verbose_name = _("user")
        verbose_name_plural = _("users")
        #abstract = True

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    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)

admin.py

from django.contrib import admin

from .models import SyainMaster

admin.site.register(SyainMaster)

0

2Answer

Comments

Comments

  1. @coltonOP

    Questioner

    何も変化はありませんでした....
  2. なるほど

    怪しいのはこことかでしょうか。
    これってdjangoがもともと使っているパスワード生成法なんでしょうか。

    user.password = make_password(password)
  3. @coltonOP

    Questioner

    すいません 少しいろいろ試してみます。

Your answer might help someone💌