Я использую CustomUser в своей модели. Это диспетчер пользователей.
class UserManager(BaseUserManager):
def create_user(self, email, username, password=None, is_staff=False, is_superuser=False, is_active=False,
is_bot=False, is_mobile_verified=False, is_online=True, is_logged_in=True):
logger = logging.getLogger(__name__)
logger.info("REGULAR user created!")
if not email:
raise ValueError('Email is required')
if not username:
raise ValueError('Username is required.')
email = self.normalize_email(email)
user = self.model(email=email, username=username, is_staff=is_staff, is_superuser=is_superuser,
is_active=is_active, is_bot=is_bot, is_mobile_verified=is_mobile_verified,
is_online=is_online, is_logged_in=is_logged_in)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
logger = logging.getLogger(__name__)
logger.info("SUPER user created!")
return self.create_user(email, username, password=password, is_staff=True, is_superuser=True, is_active=True,
is_bot=False, is_mobile_verified=False, is_online=True, is_logged_in=True)
Это мое определение пользовательской модели пользователя.
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True, max_length=255)
mobile = PhoneNumberField(null=True)
username = models.CharField(null=False, unique=True, max_length=255)
full_name = models.CharField(max_length=255, blank=True, null=True)
birthday = models.DateField(null=True)
gender = models.CharField(max_length=255, null=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
is_mobile_verified = models.BooleanField(default=False)
is_online = models.BooleanField(default=False)
is_logged_in = models.BooleanField(default=True)
is_bot = models.BooleanField(default=False)
location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
#objects = UserManager()
get_user_model().objects.create_user(...)
Если я раскомментирую строку objects = UserManager(), я могу запустить сервер, но суперпользователи, созданные из бэкэнда администратора, не смогут войти в систему.
Если я использую get_user_model(), код ломается, и я получаю следующую ошибку
"AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'bouncer.User' that has not been installed
Но в моем settings.py я определил модель пользователя auth
AUTH_USER_MODEL = 'bouncer.User'
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
Что я здесь делаю не так?
@Ray нет, я не мог. Я вручную переместил проект .... представьте!
Не могли бы вы опубликовать свой INSTALLED_APPS из settings.py? Возможно, произошел сбой при импорте или необходимо изменить порядок импорта.
Вы вызываете get_user_model().objects.create_user(...) в рамках своей пользовательской модели ??
Я неправильно понимаю: почему вы вызываете create_user в определении вашего класса User?
У меня было это сообщение об ошибке при попытке выполнить «миграцию» для AUTH_USER_MODEL. Причина в том, что внутри того же приложения с AUTH_USER_MODEL была вторая модель с использованием get_user_model (). Необходимо было закомментировать вторую модель и произвести «миграцию» в два этапа.






Эта ошибка выглядит так, будто bouncer отсутствует в вашем INSTALLED_APPS.
Итак, чтобы уточнить, вы должны иметь
bouncer/models.py, содержащий модель User (или models/__init__.py, который импортирует модель из другого файла)'bouncer' в списке INSTALLED_APPS в настройкахAUTH_USER_MODEL = 'bouncer.User' (как и у вас).Да, вышибала есть в списке установленных приложений.
находится ли bouncer перед вашим приложением в списке установленных приложений? Из вопроса не совсем очевидно, когда вы на самом деле вызываете get_user_model, но если это происходит, когда django загружает ваше приложение, сначала нужно будет загрузить bouncer.
попробуйте импортировать from django.db import models, только после, импортируя from django.contrib.auth.models import AbstractUser
Убедитесь, что вы зарегистрировали свою модель в admin.py, а не в models.py
# admin.py
from django.contrib.auth.admin import UserAdmin
admin.site.register(YourUser, UserAdmin)
Это решило проблему для меня.
Проблема также может возникнуть из-за ограничения прав доступа к файлам. Убедитесь, что папке "bouncer" предоставлены необходимые разрешения.
Для всех, кто читает это в 2020 году, я подозреваю, что проблема связана с зависимостью. Я столкнулся с той же ошибкой, что и OP.
Ваши первые две проверки должны быть:
1 - Находится ли приложение в списке installed apps в вашем settings.py?
2 - Установлен ли AUTH_USER_MODEL = "app_name_from_apps_py.model_name" в settings.py?
Это касается большинства других ответов, которые я прочитал.
Чего я не понял, читая документацию, так это того, что для использования get_user_model() вам нужно сначала установить свою модель. Конечно да ?!
Итак, выше, где OP использует get_user_model(), они создают циклическую зависимость.
Вы не можете использовать get_user_model() в классе, который создает эту модель.
Попробуйте изменить положение приложения-вышибалы на вашем INSTALLED APPS, у меня это сработало.
В моем случае я случайно вставил в класс Meta моего настраиваемого пользователя атрибут abstract = True. Таким образом возникает эта ошибка.
Никогда не помещайте настраиваемую модель пользователя и дополнительные модели, содержащие ссылки на модель пользователя, в один файл models.py в одном приложении. Это может быть связано с той ошибкой.
Плохая идея, приводящая к этой ошибке:
# customUserModel/models.py
from django.contrib.auth.models import AbstractUser
from django.conf import settings
class User(AbstractUser):
pass
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
some_field = models.CharField(max_length=25)
Это хорошая идея:
# customUserModel/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
# additionalUserProfile/models.py
from django.conf import settings
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
some_field = models.CharField(max_length=25)
#settings.py
AUTH_USER_MODEL = 'customUserModel.User'
Для меня это было потому, что у меня был myapp/models/__init__.py, и я попытался поместить определение пользовательской модели User в myapp/models/user.py и установить AUTH_USER_MODEL = myapp.User. Перенос пользовательского определения модели User в myapp/models/__init__.py исправил это. Мне не удалось импортировать его в __init__.py; Мне пришлось перенести определение туда.
вам удалось заставить это работать? после обновления до 2.1.4 с 2.0.6 я получаю эту ошибку, и мои настройки идентичны вашим.