首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django- AbstractBaseUser模型的登录问题

django- AbstractBaseUser模型的登录问题
EN

Stack Overflow用户
提问于 2022-09-12 06:43:11
回答 2查看 71关注 0票数 1

我用AbstractBaseUser模型创建了自定义用户模型。创建的用户工作良好,我已经检查了管理页面。

但问题是..。当我尝试从自定义用户模型登录现有用户时,用户名似乎是从数据库中验证的,但它似乎无法从数据库中获取或验证密码。

这是我的项目代码。

models.py

代码语言:javascript
复制
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, UserManager

# Create your models here.


class AccountManager(BaseUserManager):
    def create_user(self, email, username, password=None):
        if not email:
            raise ValueError("반드시 이메일 주소가 있어야 합니다.")
        if not username:
            raise ValueError("아이디는 반드시 있어야 합니다.")

        user = self.model( 
                email=self.normalize_email(email),
                username=username,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password=None):
        user = self.create_user( 
            email=self.normalize_email(email),
            password=password,
            username=username,
        )
        user.is_admin = True
        user.is_staff = True 
        user.is_superuser = True
        user.save(using=self._db)
        return user



class Member(AbstractBaseUser):
    MALE = 'M'
    FEMALE = 'F'
    GENDER_CHOICE = [ 
        (MALE, '남성'),
        (FEMALE, '여성'),
    ]

    YES = '동의'
    NO = '미동의'
    SMS_CHOICE = [ 
        (YES, '동의'),
        (NO, '미동의'),
    ]

    FOREIGNER = '외국인'
    NATIVE = '내국인'
    FOREIGN_CHECK = [ 
        (FOREIGNER, '외국인'),
        (NATIVE, '한국인'),
    ]


    no = models.CharField(verbose_name="스카이패스 회원번호", max_length=10, unique=True)
    username = models.CharField(verbose_name="회원 아이디", max_length=20, unique=True )
    password = models.CharField(verbose_name="비밀번호", max_length=500)
    date_joined = models.DateTimeField(verbose_name="회원가입 일자", auto_now_add=True)
    last_login = models.DateTimeField(verbose_name="마지막 로그인 시간", auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    first_name = models.CharField(max_length=10, verbose_name="이름", blank=True)
    last_name = models.CharField(max_length=10, verbose_name="성", blank=True)
    gender = models.CharField(verbose_name="성별", choices= GENDER_CHOICE, max_length=10)
    email = models.EmailField(verbose_name="이메일", max_length=60, unique=True)
    birthday = models.CharField(verbose_name='생년월일', default=None, max_length=100, null=True )
    phone = models.CharField(verbose_name='연락처', default=None, max_length=20, null=True)
    security1 = models.CharField(verbose_name="주민번호 앞자리", default=None, max_length=10, null=True, blank=True)
    security2 = models.CharField(verbose_name='주민번호 뒷자리', default=None, max_length=10, null=True, blank=True)
    sms = models.CharField(verbose_name="문자 수신 동의 여부", choices= SMS_CHOICE, default=None, max_length=10, null=True )
    check_foreign = models.CharField(verbose_name='외국인 여부 확인', choices= FOREIGN_CHECK, default=None, max_length=10, null=True)
    passport = models.CharField(verbose_name='여권번호', max_length=30, blank=True, null=True)
    p_points = models.IntegerField(verbose_name="잔여 포인트", default=0)



    USERNAME_FIELD = 'username' 
    REQUIRED_FIELDS = ['no', 'email' ]    

    objects = AccountManager 
    objects = UserManager()

    class Meta:
        db_table = 'member'


    def __str__(self):
        return self.last_name + ' ' + self.first_name

    def has_perm(self, perm, ob=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

views.py

代码语言:javascript
复制
from django.shortcuts import render, redirect 
from django.contrib import messages
from django.http import HttpRequest
from django.contrib.auth import authenticate, login, logout
from register.models import Member
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, UserManager

# Create your views here.


def loginPage(request):
    global Member
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username)
        print(password)
        try:
            user = Member.objects.get(username=username)
        except:
            messages.error(request, "username does not exist")

        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            return redirect('/')
        else:
            messages.error(request, "username or password does not exit.")

            

    context = {}
    return render(request, 'register/login.html', context)


def logoutUser(request):
    logout(request)
    return redirect('/')

login.html

代码语言:javascript
复制
{% extends 'layout/layout.html' %}

{% block content %}

<div>
    <form method="POST" action="">
        {% csrf_token %}
        <label>Username:</label>
        <input type="text" name="username" placeholder="Enter username" />

        <label>Password:</label>
        <input type="password" name="password" placeholder="Enter Password" />


        <input type="submit" value="Login"/>
    </form>
</div>
{% endblock %}

请帮帮我!我已经为这个问题挣扎了两天了,我在网上任何地方都找不到这个问题的答案。

EN

Stack Overflow用户

回答已采纳

发布于 2022-09-12 16:28:41

更新

所以经过几天几个小时的尝试,我终于解决了这个问题。

只要AbstractBaseUser设置正确,就不会有其他问题。

然而,我不得不导入'get_user_model‘来带来定制的用户模型。

简单地说,把这个放在Views.py上就行了

代码语言:javascript
复制
from django.contrib.auth import get_user_model
from .models import "custom_user_name" #This is your own custom user name which you defined in models.py as class custom_user_name(AbstractBaseUser):

# write this too.
User = get_user_model()

有大量的youtube视频向您展示如何创建自定义用户,但我找不到任何人向我展示如何导入自定义用户模型。

我希望这也能为面临这一问题的人节省时间。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73685372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档