Я пытаюсь перейти на пользовательскую модель пользователя, но возникает ошибка - PullRequest
1 голос
/ 02 августа 2020

Я пытаюсь изменить модель пользователя Django на пользовательскую модель, но возникает ошибка

Как устранить ошибку? спасибо, что дайте мне знать ~!

step1 settings.py

AUTH_USER_MODEL = 'accounts.User'

step2 accounts / models.py

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

# Create your models here.
class User(AbstractBaseUser):
    email = models.EmailField(blank=True)
    website_url = models.URLField(blank=True)

step3 При миграции возникает следующая ошибка

(askcompany) C:\my_django\askcompany>python manage.py makemigrations

сообщение об ошибке:

  File "C:\Users\hyunsepk\AppData\Local\conda\conda\envs\askcompany\lib\site-packages\django\contrib\auth\checks.py", line 39, in check_user_model
    if cls.USERNAME_FIELD in cls.REQUIRED_FIELDS:
AttributeError: type object 'User' has no attribute 'USERNAME_FIELD'

step4, и я перешел на это, но возникла другая ошибка

accounts / models.py

class User(AbstractBaseUser):
    """User model."""

    username = None
    email = models.EmailField(blank=True)
    website_url = models.URLField(blank=True)


    USERNAME_FIELD = 'email'

сообщение об ошибке:

(askcompany) C:\my_django\askcompany>python manage.py makemigrations
Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\hyunsepk\AppData\Local\conda\conda\envs\askcompany\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\hyunsepk\AppData\Local\conda\conda\envs\askcompany\lib\site-packages\django\core\management\__init__.py", line 377, in execute
    django.setup()
  File "C:\Users\hyunsepk\AppData\Local\conda\conda\envs\askcompany\lib\site-packages\django\__init__.py", line 24, in setup

(askcompany) C:\my_django\askcompany>python manage.py makemigrations
SystemCheckError: System check identified some issues:

ERRORS:
accounts.User: (auth.E003) 'User.email' must be unique 
because it is named as the 'USERNAME_FIELD'.

step5 я снова меняю на это

class User(AbstractUser):
    """User model."""

    email = models.EmailField(blank=True, unique=True)
    website_url = models.URLField(blank=True)


    USERNAME_FIELD = 'email'

другое сообщение об ошибке:

ERRORS:
accounts.User: (auth.E002) The field named as the 'USERNAME_FIELD' for a custom user model must not be included in 'REQUIRED_FIELDS'.

Ответы [ 3 ]

1 голос
/ 02 августа 2020

Поскольку ваша ошибка ясно указывает, что «User.email» должен быть уникальным. Имя пользователя не может быть дублированным или пустым. измените поле электронной почты, как показано ниже -

email = models.EmailField(unique=True)

, и оно должно работать.

Edit - измените свою модель пользователя, как показано ниже -

class User(AbstractBaseUser):
    username = models.CharField(db_index=True, unique=True, max_length=255)
    email = models.EmailField(unique=True)

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

Если вы хотите использовать разрешений, я бы порекомендовал вам также унаследовать PermissionsMixin своему пользователю или унаследовать AbstractUser вместо AbstractBaseUser.

0 голосов
/ 02 августа 2020

Ошибка говорит о том, что USERNAME_FIELD не имеет атрибута. Поэтому, если вам не нужно поле имени, вы можете указать Django, что вы собираетесь использовать поле электронной почты в качестве USERNAME_FIELD, как это.

class User(AbstractBaseUser):
    """User model."""

    username = None
    email = models.EmailField(unique=True,blank=True)
    website_url = models.URLField(blank=True)


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

Просмотрите этот документ, это объяснит вам больше.

https://www.fomfus.com/articles/how-to-use-email-as-username-for-django-authentication-removing-the-username

0 голосов
/ 02 августа 2020

Вы должны наследовать от AbstractUser:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    """User model."""

    email = models.EmailField(blank=True)
    website_url = models.URLField(blank=True)

Если вы хотите установить email в качестве поля имени пользователя, вам нужно установить unique=True:

class User(AbstractUser):
    """User model."""

    email = models.EmailField(unique=True, blank=True)
    website_url = models.URLField(blank=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...