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:
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user