ОШИБКИ: inside.UserProfile.user: (fields.E301) Поле определяет связь с моделью 'auth.User', которая была заменена

Я новичок в Django. Я пытаюсь создать приложение с аутентификацией пользователя. Однако мне нужны дополнительные поля, такие как страна и номер телефона, и я не хочу никакого поля имени пользователя (я хочу, чтобы номер телефона действовал как имя пользователя), поэтому я создал пользовательский класс пользователя. Есть вопросы, которые уже были заданы, с такой же ошибкой, но они не совсем относятся к моему случаю использования, и решения не работают для меня.

models.py:

from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractBaseUser
from django.conf import settings

from django_countries.fields import CountryField

# Create your models here.

class UserProfile(AbstractBaseUser):

    user = models.OneToOneField(User, on_delete = models.DO_NOTHING)

    phone_number = models.CharField(max_length = 16, unique = True, blank = False, null = False)
    country = CountryField()
    uid = models.UUIDField(
        default = None,
        blank = True,
        null = True,
        unique = True,
    )
    USERNAME_FIELD = "uid"
    REQUIRED_FIELDS = ['phone_number', 'country']

forms.py:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from .models import UserProfile

from django_countries.fields import CountryField


# Create your forms here..

class NewUserForm(UserCreationForm):
    phone_number = forms.RegexField(max_length = 16, regex = r'^\+?1?\d{9,15}$')
    country = CountryField()
    
    class Meta:
        model = UserProfile
        fields = ("phone_number", "country", "password1", "password2")
        
    def save(self, commit = True):
        user = super(NewUserForm, self).save(commit = False)
        user.phone_number = self.cleaned_data['phone_number']
        user.username = user.phone_number
        user.country = self.cleaned_data['country']
        if commit:
            user.save()
        return user

settings.py:

Django выбрасывает эту ошибку:

Watching for file changes with StatReloader
Performing system checks...

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Users\Kanav\AppData\Local\Programs\Python\Python39\lib\threading.py", line 973, in _bootstrap_inner
    self.run()
  File "C:\Users\Kanav\AppData\Local\Programs\Python\Python39\lib\threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\Kanav\AppData\Local\Programs\Python\Python39\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Kanav\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\management\commands\runserver.py", line 124, in inner_run
    self.check(display_num_errors=True)
  File "C:\Users\Kanav\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\management\base.py", line 488, in check
    raise SystemCheckError(msg)
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
inside.UserProfile.user: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out.
        HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.

System check identified 1 issue (0 silenced).

Вы определяете связь с моделью по умолчанию User, которую вы больше не используете, так как создали пользовательскую модель пользователя. Удалите one_to_one_field, чтобы избежать этой ошибки. А для дальнейших ошибок необходимо создать пользовательскую модель manager

from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractBaseUser
from django.conf import settings

from django_countries.fields import CountryField

# Create your models here.

class UserProfile(AbstractBaseUser):
    # Remove this as you no longer using the default User Model.
    # user = models.OneToOneField(User, on_delete = models.DO_NOTHING)
    phone_number = models.CharField(max_length = 16, unique = True, blank = False, null = False)
    country = CountryField()
    # As you are using UID as your username field 
    # it is not safe to make it blank and null true 
    uid = models.UUIDField(
        default = None,
        blank = True,
        null = True,
        unique = True,
    )
    USERNAME_FIELD = "uid"
    REQUIRED_FIELDS = ['phone_number', 'country']
    # Create your custom user manager 
    objects = YOUR_CUSTOM_USER_MANAGER()

Примечание: Поскольку вы используете uid в качестве поля имени пользователя, вы должны написать пользовательский бэкенд аутентификации, чтобы вы могли использовать номер телефона для аутентификации пользователя, иначе вы должны использовать номер телефона в качестве поля имени пользователя, если вы не хотите создавать пользовательский бэкенд аутентификации.

Вернуться на верх