#python #django #django-models
#python #django #django-модели
Вопрос:
Я хочу связать модель моего профиля с моделью пользователя из класса AbstractUserModel с помощью OneToOneFields. Возможно ли это? Или любое решение этой проблемы. Здесь мой models.py
from django.db import models
#from django.contrib.auth.models import User
from django.contrib.auth.models import (
AbstractBaseUser
)
class User(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
active = models.BooleanField(default=True)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
@property
def is_staff(self):
return self.staff
@property
def is_admin(self):
return self.admin
@property
def is_active(self):
return self.active
class Profile(models.Model):
#HERE
user = models.OneToOneField(AbstractBaseUser, on_delete=models.CASCADE)
nama_lengkap = models.CharField(max_length=100, blank=True, null=True)
tgl_lahir = models.DateField(null=True, blank=True)
alamat = models.CharField(max_length=255)
foto_profil = models.ImageField(upload_to='foto_profil',blank=True)
jabatan = models.ForeignKey(Jabatan, on_delete=models.CASCADE)
def __str__(self):
return "{} - {}".format(self.user, self.nama_lengkap)
когда я переношу это, просто отобразите сообщение об ошибке, подобное этому:
SystemCheckError: проверка системы выявила некоторые проблемы:
ОШИБКИ: пользователи.Поле Profile.user: (fields.E300) определяет связь с моделью ‘AbstractBaseUser’, которая либо не установлена, либо является абстрактной. Пользователи.Profile.user: (fields.E307) Поле users.Profile.user был объявлен с отложенной ссылкой на ‘auth.abstractbaseuser’, но приложение ‘auth’ не предоставляет модель ‘abstractbaseuser’.
заранее спасибо
Комментарии:
1. добавили ли вы
AUTH_USER_MODEL = 'users.User'
в свой settings.py ??2. Нет, это необходимо?
3. Да, поскольку вы используете пользовательскую модель пользователя
Ответ №1:
вам нужно заменить это
user = models.OneToOneField(AbstractBaseUser, on_delete=models.CASCADE)
с помощью
user = models.OneToOneField(User, on_delete=models.CASCADE)
Комментарии:
1. по-прежнему нет выбора «User», когда я пытаюсь добавить строку профиля через localhost: 8000/admin /users /profile /add/
2. добавили ли вы какого-либо пользователя в свою базу данных?
3. в phpmyadmin у меня есть auth_user и users_user.
4. вы создали какого-либо пользователя в своей таблице user или нет?
Ответ №2:
Однако я рекомендую вам сделать это по-другому: вместо создания второй модели пользователя расширьте существующую:
#models.py
class ProfileUser(AbstractUser):
extra_field = models.CharField(max_length=100)
username = models.CharField(max_length=20) # modifing existing field
```
```
#settings.py
AUTH_USER_MODEL = "app_name.ProfileUser"