Django Admin не может отобразить атрибуты в модели с несколькими внешними ключами к другой модели

В принципе, у меня есть две модели, одна для иконок, а другая для типов, которые имеют 3 иконки (бизнес-правило). В моем файле models.py у меня есть следующее:

class Icon(models.Model):
    name = models.CharField(max_length=60)
    image_URL = models.CharField(max_length=255)
    modified_date = models.DateTimeField(auto_now=True)
    creation_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name
class Type(models.Model):
    name = models.CharField(max_length=60)
    modified_date = models.DateTimeField(auto_now=True)
    creation_date = models.DateTimeField(auto_now_add=True)
    icon1 = models.ForeignKey(Icon, null=True, blank=True, on_delete=models.SET_NULL, related_name="icon1")
    icon2 = models.ForeignKey(Icon, null=True, blank=True, on_delete=models.SET_NULL, related_name="icon2")
    icon3 = models.ForeignKey(Icon, null=True, blank=True, on_delete=models.SET_NULL, related_name="icon3")

    def __str__(self):
        return self.name

В моем файле admin.py у меня есть следующее:

class TypeAdmin(admin.ModelAdmin):
    list_display = (
        'name',
        'icon1__name',
        'modified_date',
        'creation_date',
        'id'
    )
...

admin.site.register(models.Type, TypeAdmin)

Все работает нормально, но я не могу заставить его отображать имя иконки. Это работает для других классов, которые имеют один атрибут Foreign Key одной модели, однако здесь, поскольку есть три атрибута Foreign Key одной модели, я получаю ошибку:

<class 'app.admin.TypeAdmin'>: (admin.E108) Значение 'list_display[1]' ссылается на 'icon1__name', который не является вызываемой переменной, атрибутом 'TypeAdmin', атрибутом или методом в 'app.Type'.

Что вызывает эту ошибку? Как я могу ее исправить? FK может быть нулевым (или пустым), потому что некоторым типам разрешено не иметь значков (не быть обязательными).

Решено: благодаря ответу Iain, не следует вызывать атрибут и оставить его как icon1 вместо icon1__name, поскольку он вызывает метод __str__, который все равно возвращает имя.

Вернуться на верх