refactor: Simplify admin photo preview - remove grid display

- Keep only single photo preview per inline (large version 800x800)
- Removed all_versions_preview display from photo inlines
- Cleaner, more focused admin interface
- Confirmed all sizes are stored correctly:
  * Large (800x800) verified
  * Medium (400x400) verified
  * Originals verified
- Use large_url() for preview in admin (best quality/size balance)
This commit is contained in:
2025-10-22 16:44:37 +03:00
parent 70f05abdb9
commit 8f3d247c3c

View File

@@ -201,119 +201,50 @@ class KitItemInline(nested_admin.NestedStackedInline):
class ProductPhotoInline(admin.TabularInline): class ProductPhotoInline(admin.TabularInline):
model = ProductPhoto model = ProductPhoto
extra = 1 extra = 1
readonly_fields = ('image_preview', 'all_versions_preview') readonly_fields = ('image_preview',)
fields = ('image', 'image_preview', 'all_versions_preview', 'order') fields = ('image', 'image_preview', 'order')
def image_preview(self, obj): def image_preview(self, obj):
"""Превью оригинального фото""" """Превью основного фото (большой размер 800×800)"""
if obj.image: if obj.image:
return format_html( return format_html(
'<img src="{}" style="max-width: 150px; max-height: 150px; border-radius: 4px;" />', '<img src="{}" style="max-width: 250px; max-height: 250px; border-radius: 4px;" />',
obj.get_original_url() obj.get_large_url()
) )
return "Нет изображения" return "Нет изображения"
image_preview.short_description = "Оригинал (превью)" image_preview.short_description = "Превью"
def all_versions_preview(self, obj):
"""Показывает все версии изображения"""
if not obj.image:
return "Нет изображения"
return format_html(
'<div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;">'
'<div><small>Миниатюра (150x150)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Средний (400x400)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Большой (800x800)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Оригинал</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'</div>',
obj.get_thumbnail_url(),
obj.get_medium_url(),
obj.get_large_url(),
obj.get_original_url()
)
all_versions_preview.short_description = "Все версии изображения"
class ProductKitPhotoInline(nested_admin.NestedTabularInline): class ProductKitPhotoInline(nested_admin.NestedTabularInline):
model = ProductKitPhoto model = ProductKitPhoto
extra = 0 # Не показывать пустые формы extra = 0 # Не показывать пустые формы
readonly_fields = ('image_preview', 'all_versions_preview') readonly_fields = ('image_preview',)
fields = ('image', 'image_preview', 'all_versions_preview', 'order') fields = ('image', 'image_preview', 'order')
def image_preview(self, obj): def image_preview(self, obj):
"""Превью оригинального фото""" """Превью основного фото (большой размер 800×800)"""
if obj.image: if obj.image:
return format_html( return format_html(
'<img src="{}" style="max-width: 150px; max-height: 150px; border-radius: 4px;" />', '<img src="{}" style="max-width: 250px; max-height: 250px; border-radius: 4px;" />',
obj.get_original_url() obj.get_large_url()
) )
return "Нет изображения" return "Нет изображения"
image_preview.short_description = "Оригинал (превью)" image_preview.short_description = "Превью"
def all_versions_preview(self, obj):
"""Показывает все версии изображения"""
if not obj.image:
return "Нет изображения"
return format_html(
'<div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;">'
'<div><small>Миниатюра (150x150)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Средний (400x400)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Большой (800x800)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Оригинал</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'</div>',
obj.get_thumbnail_url(),
obj.get_medium_url(),
obj.get_large_url(),
obj.get_original_url()
)
all_versions_preview.short_description = "Все версии изображения"
class ProductCategoryPhotoInline(admin.TabularInline): class ProductCategoryPhotoInline(admin.TabularInline):
model = ProductCategoryPhoto model = ProductCategoryPhoto
extra = 1 extra = 1
readonly_fields = ('image_preview', 'all_versions_preview') readonly_fields = ('image_preview',)
fields = ('image', 'image_preview', 'all_versions_preview', 'order') fields = ('image', 'image_preview', 'order')
def image_preview(self, obj): def image_preview(self, obj):
"""Превью оригинального фото""" """Превью основного фото (большой размер 800×800)"""
if obj.image: if obj.image:
return format_html( return format_html(
'<img src="{}" style="max-width: 150px; max-height: 150px; border-radius: 4px;" />', '<img src="{}" style="max-width: 250px; max-height: 250px; border-radius: 4px;" />',
obj.get_original_url() obj.get_large_url()
) )
return "Нет изображения" return "Нет изображения"
image_preview.short_description = "Оригинал (превью)" image_preview.short_description = "Превью"
def all_versions_preview(self, obj):
"""Показывает все версии изображения"""
if not obj.image:
return "Нет изображения"
return format_html(
'<div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;">'
'<div><small>Миниатюра (150x150)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Средний (400x400)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Большой (800x800)</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'<div><small>Оригинал</small><br>'
'<img src="{}" style="width: 100%; height: 100px; object-fit: cover; border-radius: 4px;" /></div>'
'</div>',
obj.get_thumbnail_url(),
obj.get_medium_url(),
obj.get_large_url(),
obj.get_original_url()
)
all_versions_preview.short_description = "Все версии изображения"
class ProductKitAdminWithItems(ProductKitAdmin): class ProductKitAdminWithItems(ProductKitAdmin):
inlines = [KitItemInline] inlines = [KitItemInline]