diff --git a/myproject/products/templates/products/tag_list.html b/myproject/products/templates/products/tag_list.html
index c69f259..5de779a 100644
--- a/myproject/products/templates/products/tag_list.html
+++ b/myproject/products/templates/products/tag_list.html
@@ -11,6 +11,24 @@
+
+
+
+
+ Быстрое создание тега
+
+
+
+
+
+
+
+
+
+
+
+
{% endblock %}
diff --git a/myproject/products/urls.py b/myproject/products/urls.py
index cace000..daa3b19 100644
--- a/myproject/products/urls.py
+++ b/myproject/products/urls.py
@@ -37,6 +37,7 @@ urlpatterns = [
# API endpoints
path('api/search-products-variants/', views.search_products_and_variants, name='api-search-products-variants'),
path('api/kits/temporary/create/', views.create_temporary_kit_api, name='api-temporary-kit-create'),
+ path('api/tags/create/', views.create_tag_api, name='api-tag-create'),
# CRUD URLs for ProductVariantGroup (Варианты товаров)
path('variant-groups/', views.ProductVariantGroupListView.as_view(), name='variantgroup-list'),
diff --git a/myproject/products/views/__init__.py b/myproject/products/views/__init__.py
index 5499667..cecae97 100644
--- a/myproject/products/views/__init__.py
+++ b/myproject/products/views/__init__.py
@@ -80,7 +80,7 @@ from .tag_views import (
)
# API представления
-from .api_views import search_products_and_variants, validate_kit_cost, create_temporary_kit_api
+from .api_views import search_products_and_variants, validate_kit_cost, create_temporary_kit_api, create_tag_api
__all__ = [
@@ -149,4 +149,5 @@ __all__ = [
'search_products_and_variants',
'validate_kit_cost',
'create_temporary_kit_api',
+ 'create_tag_api',
]
diff --git a/myproject/products/views/api_views.py b/myproject/products/views/api_views.py
index dc41b25..cb0bf68 100644
--- a/myproject/products/views/api_views.py
+++ b/myproject/products/views/api_views.py
@@ -620,3 +620,94 @@ def create_temporary_kit_api(request):
'success': False,
'error': f'Ошибка при создании комплекта: {str(e)}'
}, status=500)
+
+
+def create_tag_api(request):
+ """
+ AJAX endpoint для быстрого создания тега из списка тегов.
+
+ Принимает JSON:
+ {
+ "name": "Новый тег"
+ }
+
+ Возвращает JSON:
+ {
+ "success": true,
+ "tag": {
+ "id": 1,
+ "name": "Новый тег",
+ "slug": "novyj-teg",
+ "is_active": true,
+ "products_count": 0,
+ "kits_count": 0
+ }
+ }
+
+ Или при ошибке:
+ {
+ "success": false,
+ "error": "Описание ошибки"
+ }
+ """
+ if request.method != 'POST':
+ return JsonResponse({
+ 'success': False,
+ 'error': 'Метод не поддерживается'
+ }, status=405)
+
+ try:
+ import json
+ from ..models import ProductTag
+
+ data = json.loads(request.body)
+ name = data.get('name', '').strip()
+
+ # Валидация
+ if not name:
+ return JsonResponse({
+ 'success': False,
+ 'error': 'Название тега не может быть пустым'
+ }, status=400)
+
+ if len(name) > 100:
+ return JsonResponse({
+ 'success': False,
+ 'error': 'Название тега слишком длинное (максимум 100 символов)'
+ }, status=400)
+
+ # Проверка уникальности (регистронезависимо)
+ if ProductTag.objects.filter(name__iexact=name).exists():
+ return JsonResponse({
+ 'success': False,
+ 'error': f'Тег "{name}" уже существует'
+ }, status=400)
+
+ # Создание тега (slug будет сгенерирован автоматически в модели)
+ tag = ProductTag.objects.create(
+ name=name,
+ is_active=True
+ )
+
+ return JsonResponse({
+ 'success': True,
+ 'tag': {
+ 'id': tag.id,
+ 'name': tag.name,
+ 'slug': tag.slug,
+ 'is_active': tag.is_active,
+ 'products_count': 0,
+ 'kits_count': 0
+ }
+ })
+
+ except json.JSONDecodeError:
+ return JsonResponse({
+ 'success': False,
+ 'error': 'Некорректный JSON'
+ }, status=400)
+ except Exception as e:
+ return JsonResponse({
+ 'success': False,
+ 'error': f'Ошибка при создании тега: {str(e)}'
+ }, status=500)