> - PullRequest
       5

>

0 голосов
/ 07 мая 2020

Это мой models.py:

Class User(AbstractBaseUser):

    first_name = models.CharField(max_length=30, blank=True, null=True)
    surname = models.CharField(max_length=30, blank=True, null=True)

    def __str__(self):
        return "%s %s" % (self.first_name, self.surname)

class Profile(models.Model):

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

    def __str__(self):
        return f"{self.user}'s profile"

    def full_name(self):
        return f"{self.first_name} {self.surname}"

class Composition(models.Model):

    title = models.CharField(max_length=120)
    composer = models.ForeignKey(Profile, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.title} {self.composer.full_name}"

Не понимаю, почему я получаю Title <bound method Profile.full_name of <Profile: MyName's profile>> в админке Django, в списке названий композиций. Позвонив по номеру self.composer.full_name(), я получу только два элемента <bound method...>. Кто-нибудь может мне помочь? Я уже некоторое время борюсь с этим и застрял.

PS:

нажатие на него возвращает:

TypeError at /admin/nms_app/composition/3/change/
__str__ returned non-string (type NoneType)

PS2:

добавление @property не помогает.

Решение:

Благодаря Suh Fangmbeng я понял, что забыл «пользователя» в методе класса Profile :

    def full_name(self):
        return f"{self.user.first_name} {self.user.surname}"

1 Ответ

0 голосов
/ 07 мая 2020

Внесите изменения в свою модель профиля следующим образом:

class Profile(models.Model):

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

    def __str__(self):
        return f"{self.user}'s profile"

    def full_name(self):
        return f"{self.user.first_name} {self.user.surname}"

Затем используйте:

def __str__(self):
    return f"{self.title} {self.composer.full_name()}"

Вместо:

def __str__(self):
    return f"{self.title} {self.composer.full_name}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...