Проблема при расширении модели 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 шт):

Автор решения: Mikhail Lazko

А когда говорится, что изучен яндекс, имеется ввиду джанго документация? Вот тут есть пример как заинлайнить 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
→ Ссылка