【问题标题】:No username attribute of model error, even already have objects = UserManager()?没有模型错误的用户名属性,甚至已经有对象 = UserManager()?
【发布时间】:2021-08-18 04:08:49
【问题描述】:

这是我在user 应用中的模型

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

class UserTable(AbstractBaseUser, PermissionsMixin):
    USERNAME_FIELD='email'
    objects = UserManager()
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    phone = models.CharField(max_length=255, default=None)
    is_active = models.BooleanField(default=False)

这是我在user 应用程序中的admin.py

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

admin.site.register(UserTable, UserAdmin)

我也加入了我的settings.py

INSTALLED_APPS = [
    ....
    'user.apps.UserConfig',
    ....
]

这是我运行python manage.py migrate时的错误

(admin.E033) The value of 'ordering[0]' refers to 'username', which is not an attribute of 'user.UserTable'.
The value of 'list_display[0]' refers to 'username', which is not a callable, an attribute of 'UserAdmin', or an attribute or method on 'user.UserTable'. 

我不知道为什么,我想当我设置usernamefirst_namelast_name 之类的字段时,设置了objects = UserManager()。我还使用USERNAME_FIELD 设置电子邮件替换username 主键。

【问题讨论】:

  • 您是否在 settings.py 中设置了AUTH_USER_MODEL
  • 不,用户名字段来自AbstractUser 来自django.contrib.auth.models.AbstractUser,而不是AbstractBaseUser

标签: python django django-models django-admin


【解决方案1】:

你应该写你自己的UserManager

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin 

class UserManager(BaseUserManager):

  def create_user(self, email, password, **extra_fields):
     if not email:
        raise ValueError('User must have an email address')
        
    user = self.model(
        email=self.normalize_email(email),
         **extra_fields
    )
    user.set_password(password)
    user.save()
    return user

 def create_superuser(self, email, password, **extra_fields):
     user = self.create_user(
        email,
        password,
        **extra_fields
    )
    return user

只是UserTable模型中的一个小评论,make

is_active = models.BooleanField(default=True)能够登录

并在settings.py文件中添加

AUTH_USER_MODEL = 'user.UserTable'

编辑

我注意到您以错误的方式拨打AbstractBaseUser, BaseUserManager

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin

试试看有什么问题告诉我!

【讨论】:

    【解决方案2】:

    问题是因为您是从 AbstractBaseUser 继承的(没有 username 字段):

    class AbstractBaseUser(models.Model):
        password = models.CharField(_('password'), max_length=128)
        last_login = models.DateTimeField(_('last login'), blank=True, null=True)
        ... # No definition for usename in this class
    

    然后使用UserAdmin(需要username 作为字段)作为您的管理员:

    @admin.register(User)
    class UserAdmin(admin.ModelAdmin):
        ...
        # The admin needs the username field as described by ordering
        # But your custom user model doesn't have it
        ordering = ('username',)
    

    有多种方法可以解决此问题,但一种方法是为您的自定义用户定义自己的模型管理员:

    from django.contrib import admin
    
    class MyAdmin(admin.ModelAdmin):
        pass
    
    
    admin.site.register(UserTable, MyAdmin)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2018-02-02
      • 2018-07-24
      • 2018-12-17
      • 2019-12-18
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多