Добавлена регистрация ConfigurableProduct в админке Django

Добавлены imports для ConfigurableProduct, ConfigurableProductOption, ConfigurableProductAttribute.
Создан ConfigurableProductAdmin с инлайнами для вариантов и атрибутов.
Поля variant_sku отображается в readonly режиме.
Добавлен счетчик вариантов в list_display с цветовой индикацией.
Организованы fieldsets для удобного редактирования.
This commit is contained in:
2025-12-30 11:37:42 +03:00
parent 4cbc2f23e3
commit 658cd59511

View File

@@ -6,6 +6,7 @@ import nested_admin
from .models import ProductCategory, ProductTag, Product, ProductKit, KitItem
from .models import ProductPhoto, ProductKitPhoto, ProductCategoryPhoto
from .models import ProductVariantGroup, KitItemPriority, SKUCounter, CostPriceHistory
from .models import ConfigurableProduct, ConfigurableProductOption, ConfigurableProductAttribute
from .admin_displays import (
format_quality_badge,
format_quality_display,
@@ -940,3 +941,57 @@ admin.site.register(ProductCategory, ProductCategoryAdminWithPhotos)
admin.site.register(ProductTag, ProductTagAdmin)
admin.site.register(Product, ProductAdminWithPhotos)
admin.site.register(ProductKit, ProductKitAdminWithItemsAndPhotos)
# === Админка для ConfigurableProduct ===
class ConfigurableProductOptionInline(admin.TabularInline):
"""Инлайн для вариантов вариативного товара"""
model = ConfigurableProductOption
extra = 0
fields = ('kit', 'product', 'variant_sku', 'is_default', 'attributes')
readonly_fields = ('variant_sku',)
verbose_name = "Вариант"
verbose_name_plural = "Варианты"
class ConfigurableProductAttributeInline(admin.TabularInline):
"""Инлайн для атрибутов родительского товара"""
model = ConfigurableProductAttribute
extra = 0
fields = ('name', 'option', 'kit', 'product', 'position', 'visible')
verbose_name = "Атрибут"
verbose_name_plural = "Атрибуты"
@admin.register(ConfigurableProduct)
class ConfigurableProductAdmin(admin.ModelAdmin):
"""Админка для вариативных товаров"""
list_display = ('name', 'sku', 'status', 'get_options_count', 'created_at')
list_filter = ('status', 'created_at')
search_fields = ('name', 'sku', 'description')
readonly_fields = ('created_at', 'updated_at', 'slug')
inlines = [ConfigurableProductOptionInline, ConfigurableProductAttributeInline]
fieldsets = (
('Основная информация', {
'fields': ('name', 'sku', 'slug', 'status')
}),
('Описание', {
'fields': ('short_description', 'description')
}),
('Служебная информация', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def get_options_count(self, obj):
"""Количество вариантов"""
count = obj.options.count()
return format_html(
'<span style="font-weight: bold; color: {};">{}</span>',
'#28a745' if count > 0 else '#6c757d',
count
)
get_options_count.short_description = 'Вариантов'