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

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

ただいまの
回答率

87.49%

Django admin画面からのログインセッションが作成されない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 468

score 25

DjangoにてWebアプリを作成しています。
スーパーユーザーを作成して、admin画面からログインしようとすると、
ログインすることができずIDとパスワードが正しいかどうかのメッセージが表示されます。
(コンソールには2020-11-08 10:29:37,540 [INFO]  C:\Users\*****\lib\site-packages\django\core\servers\basehttp.py(Line:157)   "POST /admin/login/?next=/admin/ HTTP/1.1" 200 2439 とだけ表示されます。)
django_sessionテーブルにレコードが作成されないため、認証の問題らしいのですが、 解決策がわからず困っています。

AbstractBaseUserからのカスタムユーザーを作成しているため、なにか設定が足りていないのだと思うのですが、、、
気にするべきポイント等、ご教示をお願いしたく存じます。

【カスタムユーザーモデル】

from django.db import models
from django.contrib.auth.base_user import BaseUserManager
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.utils.translation import gettext_lazy as _
from django.utils import timezone


class Users_manager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, user_id, password, name,**extra_fields):
        if not user_id:
            raise ValueError('The given user_id must be set')
        user_id = self.model(user_id)
        user = self.model(user_id=user_id, name=name, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, user_id, password=None, name=None, **extra_fields):
        extra_fields.setdefault('is_active', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(user_id, password, name, **extra_fields)

    def create_superuser(self, user_id, password=None, name=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(user_id, password, name, **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 Users(AbstractBaseUser, PermissionsMixin):
    userid_validator = UnicodeUsernameValidator()

    user_id = models.CharField(
        primary_key=True,
        max_length=255,
        validators=[userid_validator],
        error_messages={
            'unique': _("A user with that user_id already exists."),# 要確認 from django.utils.translation import gettext_lazy as _
        },
    )
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(
        _('active'),
        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 = Users_manager()

    USERNAME_FIELD = 'user_id'
    REQUIRED_FIELDS = ['name']#  ['user_id','name']  REQUIRED_FIELDSは必須を定義しているが、USERNAME_FIELDで定義してある場合は不要っぽい?





    class meta:
        verbose_name_plural = 'Users'

    def get_name(self):
        return self.name

【settings.py 関係ありそうなところ】

AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)


ACCOUNT_AUTHENTICATION_METHOD = 'user_id'
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_EMAIL_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る