ОШИБКИ: 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 в качестве поля имени пользователя, вы должны написать пользовательский бэкенд аутентификации, чтобы вы могли использовать номер телефона для аутентификации пользователя, иначе вы должны использовать номер телефона в качестве поля имени пользователя, если вы не хотите создавать пользовательский бэкенд аутентификации.