自定义用户模型的用户名和密码不正确

时间:2021-06-23 20:02:14

标签: python django django-models django-admin

我创建了一个自定义用户模型

models.py:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

# Create your models here.

class MyAccountManager(BaseUserManager):

    def create_user(self, username, email, password=None):
        if not email:
            raise ValueError("Wrong!")
        if not username:
            raise ValueError("Wrong!")
        user = self.model(
            username =username,
            email = self.normalize_email(email),
            )
        user.set_password(password)
        user.save(using = self._db)
        return user

    def create_superuser(self, username, email, password):
        user = self.create_user(
            username = username,
            email = self.normalize_email(email),
            password = password
            )
        user.is_superuser = True
        user.is_admin = True
        user.is_staff = True
        print(user, self.normalize_email(email), password)

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

class Account(AbstractBaseUser):
    username = models.CharField(max_length=15, unique=True)
    email = models.EmailField(max_length=60, verbose_name='email address', unique=True)
    address = models.CharField(max_length=200, null=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)

    objects = MyAccountManager()

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

    def __str__(self):
        return self.username

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

    def has_module_perms(self, app_label):
        return True

即使在 admin.py 文件中进行了正确的设置:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import Account

# Register your models here.

class AccountAdmin(UserAdmin):
    list_display = ['username', 'email', 'address']
    search_fields = ['username', 'email']
    readonly_fields = ['address']

    filter_horizontal = ()
    list_filter = ()
    fieldsets = ()

admin.site.register(Account, AccountAdmin)

但是管理面板告诉我用户名和密码不是超级用户。或者用户名/密码不正确

>>> from user_auth.models import Account
>>> u = Account.objects.all()
>>> u
<QuerySet [<Account: ephiram>]>
>>> u = Account.objects.get(username='ephiram')
>>> u.username
'ephiram'
>>> u.email
'djksdjkj@gmail.com'

用户 'ephiram' 是会员,但仍然被拒绝, 为什么管理仪表板告诉我用户名/密码错误?我已经坚持了几个小时了。

1 个答案:

答案 0 :(得分:0)

您不需要在 models.Account 中编写 is_superuser、is_active 之类的东西。它们已经存在于 AbstractUser 模型中。只需修改您现有的代码。下面的代码工作正常。

from django.db import models
from django.contrib.auth.models import AbstractUser

class Account(AbstractUser):
address = models.CharField(max_length=200, null=True)

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

def __str__(self):
    return self.username

from django import forms
from django.contrib.auth.forms import UserCreationForm

class User_Creation_Form(UserCreationForm):  
class Meta:
    model = Account 
    fields = "__all__"

from .forms import User_Creation_Form
from .models import Account
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

class User_Admin(UserAdmin):
    model = Account
    add_form = User_Creation_Form
    
admin.site.register(Account, User_Admin)
相关问题