Как добавить связанный объект в представление индекса администратора?

Я хочу иметь возможность показать, было ли изображение связано с каждым продуктом из представления list_display. Кажется, у меня проблемы, потому что я имею дело со связанным объектом.

модели.py

class ImageMain(models.Model):
    """This is the Main Image of the product"""
    product = models.ForeignKey(Product)
    photo = models.ImageField(upload_to='lcdtvs')  
    pub_date = models.DateTimeField('date published', auto_now_add=True)

class Product(models.Model):
   name = models.CharField(max_length=100)
   poll = models.ForeignKey(Poll)
   pub_date = models.DateTimeField('date published', auto_now_add=True)
   size = models.IntegerField(default=0)

admin.py

def photo_for_product(obj):
    images = obj.imagemain_set.all()
    return images[0].photo

class ProductAdmin(admin.ModelAdmin):
   list_display = ('name', "photo_for_product")
   inlines = [DescriptionInline, FeatureInline, AffiliateInline]

   def upper_case_name(self, obj):
       return ("%s" % (obj.name)).upper()

   def photo_for_product(self, obj):
       images = self.imagemain_set.all()
       return images[0].photo

admin.site.register(ImageMain)
admin.site.register(Product, ProductAdmin)

По какой-то причине upper_case_name() отлично отображается в представлении списка. Photo_for_product() просто продолжает отображаться (Нет).

Я также пробовал использовать pdb в методе photo_for_product, но Django это не нравится.

Я также попытался поместить callable перед методом ModelAdmin, однако это вызвало много ошибок:

ProductAdmin.list_display[1], 'photo_for_product' is not a callable or an attribute of 'ProductAdmin' or found in the model 'Product'.

person BryanWheelock    schedule 22.09.2009    source источник


Ответы (3)


Из вашего вопроса не совсем понятно, что вы хотите получить на выходе. Вы говорите, что хотите знать, «было ли связано изображение» - если да, вы можете попробовать это:

def photo_for_product(self, obj):
    images = self.imagemain_set.all()
    if images:
        return True
    else:
        return False
photo_for_product.boolean = True

Если вы действительно хотите увидеть изображение, вам нужно вернуть некоторый HTML-код, который отображает его в теге img.

def photo_for_product(self, obj):
    images = self.imagemain_set.all()
    if images:
        return '<img src="%s">' % images[0].photo.url
    else:
        return ''
photo_for_product.allow_tags = True
person Daniel Roseman    schedule 22.09.2009
comment
Я хотел, чтобы на выходе была строка пути к изображению. По-видимому, проблема в том, что images[0].photo — это ImageFieldFile, а не строка. - person BryanWheelock; 23.09.2009

Напишите метод, который возвращает необходимую информацию в виде строки, и добавьте имя метода в list_displays вашего класса администратора.

person Jeff Ober    schedule 22.09.2009

Я хотел, чтобы на выходе была строка пути к изображению. По-видимому, проблема в том, что images[0].photo — это ImageFieldFile, а не строка.

Кажется, что по умолчанию ImageFieldFile имеет следующие атрибуты:
ImageFieldFile.name
ImageFieldFile.path
ImageFieldFile.url

Все эти атрибуты возвращают строки в формате Юникод.

person BryanWheelock    schedule 23.09.2009