Нет атрибута имени пользователя в модели ошибка, даже уже есть объекты = UserManager()?

Вот моя модель в приложении 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)

Вот мой admin.py внутри user приложения.

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'. 

Я не знаю почему, я думал, что когда я устанавливаю objects = UserManager() такие поля как username, first_name, last_name устанавливаются. Я также использую USERNAME_FIELD для установки электронной почты, заменяющей username первичный ключ.

Вы должны написать свои собственные 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 модель, марка

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

Попробуйте и скажите мне, если есть какие-либо проблемы!

Проблема заключается в том, что вы наследуете от 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)
Вернуться на верх