diff --git a/lpon_site/frontend/admin.py b/lpon_site/frontend/admin.py index 624acb1..d6e1956 100644 --- a/lpon_site/frontend/admin.py +++ b/lpon_site/frontend/admin.py @@ -58,7 +58,7 @@ def get_related_article_description(model_class): f' со всеми SEO-атрибутами и slag, но автоматика несовершенна.
 ') -def render_image_thumbnail(image_field, size=(40, 40), title='миниатюра'): +def render_image_thumbnail(image_field, size=(40, 40), title='img'): """ Универсальный хелпер для отображения миниатюры изображения в админке. @@ -69,7 +69,7 @@ def render_image_thumbnail(image_field, size=(40, 40), title='миниатюра Args: image_field: Объект изображения (FilerImageField или ImageFieldFile) или None size: Кортеж (ширина, высота) для миниатюры. По умолчанию (40, 40) - title: Описание картинки в alt атрибуте (по умолчанию 'миниатюра') + title: Описание картинки в alt атрибуте (по умолчанию 'img') Returns: str: HTML-строка с тегом img или сообщение об ошибке @@ -97,7 +97,7 @@ def render_image_thumbnail(image_field, size=(40, 40), title='миниатюра # format_html автоматически экранирует опасные символы width, height = size return format_html( - '{}', + '', thumbnail.url, # ← Параметры отдельно width//2, height//2, @@ -109,7 +109,7 @@ def render_image_thumbnail(image_field, size=(40, 40), title='миниатюра return mark_safe('(ошибка)') # Если картинка не привязана - return mark_safe('') + return mark_safe('') @@ -337,7 +337,7 @@ class ImageMetadataAdmin(admin.ModelAdmin): Отображает миниатюру картинки (40x40) в списке и в list_display_links. Использует universal helper render_image_thumbnail(). """ - return render_image_thumbnail(obj.image if obj else None, size=(40, 40), title='картинка') + return render_image_thumbnail(obj.image if obj else None, title='картинка') # Установляем название столбца в админке image_thumbnail.short_description = 'img 40x40' @@ -1151,7 +1151,7 @@ class ArticleAdmin(RequestInFormMixin, admin.ModelAdmin): Отображает миниатюру изображения статьи (40x40) в списке. Использует universal helper render_image_thumbnail(). """ - return render_image_thumbnail(obj.k_article_to_image if obj else None, size=(40, 40), title='статья') + return render_image_thumbnail(obj.k_article_to_image if obj else None, title='обложка') article_thumbnail.short_description = 'img' @@ -1327,12 +1327,24 @@ class OfferAdmin(RequestInFormMixin, admin.ModelAdmin): verbose_name = 'Изображения и метаданные-изображений коммерческого предложения' verbose_name_plural = 'Изображения и метаданные-изображений коммерческих предложений' - list_display = ('id', 's_offer', 'k_offer_to_item', 'f_offer_price', 'i_offer_quantity', 'i_offer_views') - list_display_links = ('id', 's_offer',) + list_display = ('id', 'offer_thumbnail', 's_offer', 'k_offer_to_item', 'f_offer_price', 'i_offer_quantity', 'i_offer_views') + list_display_links = ('id', 'offer_thumbnail', 's_offer',) list_filter = ('l_offer_condition_media', 'l_offer_condition_sleeve', 't_offer_created', 'l_offer_to_format') search_fields = ('s_offer',) inlines = [OfferImageInline] # Управление картинками в inline readonly_fields = ('s_offer_code', 't_offer_created', 't_offer_updated',) + + def offer_thumbnail(self, obj): + """ + Отображает миниатюру первой картинки оффера (по i_img_sort) в списке. + Использует universal helper render_image_thumbnail(). + """ + first_meta = obj.m_image.first() + image = first_meta.image if first_meta else None + return render_image_thumbnail(image, title='Первая картинка оффера') + + offer_thumbnail.short_description = '1\'st img' + fieldsets = ( ('Код товара в базе', { 'fields': ('s_offer_code',),