Реализован полный CRUD для тегов товаров

Упрощена модель ProductTag:
- Удалены поля soft delete (is_deleted, deleted_at, deleted_by)
- Добавлено поле is_active для управления статусом
- Упрощены менеджеры и методы модели

Создан CRUD функционал:
- ProductTagForm: форма с автогенерацией slug
- Views: список, создание, просмотр, редактирование, удаление
- URL маршруты: /products/tags/*
- Шаблоны: list, form, detail, confirm_delete

Особенности:
- Поиск по названию и slug
- Фильтрация по статусу активности
- Статистика использования тегов в товарах/комплектах
- Пагинация (20 на страницу)
- Предупреждение при удалении с отображением связанных объектов
- Добавлена ссылка "Теги" в навигацию

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-11 23:14:01 +03:00
parent 4a1f8266de
commit 1a0360f8c0
12 changed files with 733 additions and 48 deletions

View File

@@ -360,29 +360,10 @@ class ProductCategoryAdmin(admin.ModelAdmin):
class ProductTagAdmin(admin.ModelAdmin):
list_display = ('name', 'slug', 'get_deleted_status')
list_filter = (DeletedFilter,)
list_display = ('name', 'slug', 'is_active')
list_filter = ('is_active',)
prepopulated_fields = {'slug': ('name',)}
search_fields = ('name',)
readonly_fields = ('deleted_at', 'deleted_by')
actions = [restore_items, delete_selected, hard_delete_selected]
def get_queryset(self, request):
"""Переопределяем queryset для доступа ко всем тегам (включая удаленные)"""
qs = ProductTag.all_objects.all()
ordering = self.get_ordering(request)
if ordering:
qs = qs.order_by(*ordering)
return qs
def get_deleted_status(self, obj):
"""Показывает статус удаления"""
if obj.is_deleted:
return format_html(
'<span style="color: red; font-weight: bold;">🗑️ Удален</span>'
)
return format_html('<span style="color: green;">✓ Активен</span>')
get_deleted_status.short_description = 'Статус'
class ProductAdmin(admin.ModelAdmin):