Нет атрибута имени пользователя в модели ошибка, даже уже есть объекты = 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)