Проблема при расширении модели users в Django 3
Необходимо добавить несколько полей к User, изучив материалы в яндексе на эту тему, написал свою реализацию
class Profile(models.Model):
"""Пользователи"""
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField("Имя", max_length=100)
surname = models.CharField("Фамилия", max_length=100)
email = models.CharField("Почта", max_length=150)
vk_id = models.CharField("vk_id", max_length=7)
phone = models.CharField("Телефон", max_length=12)
def __str__(self):
return self.name
class Meta():
verbose_name = "Пользователь"
verbose_name_plural = "Пользователи"
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
При попытке создать нового пользователя(User), в админке не отображается ничего из Profile, поэтому не могу изменить информацию
Если я пытаюсь создать новый экземпляр Profile, то мне говорится, что ...
Что можно сделать в таком случае, чтобы я мог редактировать пользователя из админки
Ответы (2 шт):
А когда говорится, что изучен яндекс, имеется ввиду джанго документация? Вот тут есть пример как заинлайнить extending-the-existing-user-model
Ошибка при добавлений связанна с тем что профиль с таким юзером видимо уже есть, так как связь 1 к 1 и в базе добавлено ограничение на уникальность.
PS.
- для отображения списка в админке не советую использовать
__str__, лучше явно определить список полей ModelAdmin.list_display. - предлагаю подумать насчет нужно ли вам иметь в двух местах поле
emailодновременно в Profile и User моделях
Как указал человек в комментариях к вопросу: в функции str, которая определяет, что выводится по умолчанию в админке. В моем случае str должна возвращать поле self.name, которое пустое.
Варианты решения:
- добавить символ, чтобы return Никогда не был пустым return f'-{self.name}'
- Переписать админку(можно в дополнение к пункту 1)
- принудительно задать значение по умолчанию и null и blank в значение False

