From 889834c694710f155c0d70a155e6145f9ee163e7 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Tue, 30 Dec 2025 10:59:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D1=80=D0=B5=D0=B7=D0=B5=D1=80=D0=B2=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BF=D1=80=D0=B5=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=BE=D0=B2=20=D0=B0=D1=80=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D1=83=D0=BB=D0=BE=D0=B2=20=D0=BE=D1=82=20=D1=80=D1=83=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - В миксин SKUUniqueMixin добавлен словарь RESERVED_PREFIXES - Префиксы PROD-, KIT-, CAT-, VAR- зарезервированы для автогенерации - При попытке ручного ввода артикула с зарезервированным префиксом выдается понятная ошибка - Проверка регистронезависимая (prod-123 тоже будет заблокирован) - Пользователю предлагается либо использовать другой артикул, либо оставить поле пустым для автогенерации - Решение элегантное, централизованное в миксине, работает для всех форм товаров --- myproject/products/forms.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/myproject/products/forms.py b/myproject/products/forms.py index aa9f1db..967a1de 100644 --- a/myproject/products/forms.py +++ b/myproject/products/forms.py @@ -12,12 +12,22 @@ class SKUUniqueMixin: """ Миксин для валидации уникальности артикула среди всех моделей. Проверяет уникальность SKU среди: Product, ProductKit, ProductCategory, ConfigurableProduct. + Также защищает зарезервированные префиксы от ручного ввода. """ + + # Зарезервированные префиксы для автогенерации + RESERVED_PREFIXES = { + 'PROD-': 'товаров', + 'KIT-': 'комплектов', + 'CAT-': 'категорий', + 'VAR-': 'вариативных товаров', + } def clean_sku(self): """ Проверяет уникальность артикула среди всех моделей с артикулами. Если SKU пустой - пропускаем (будет сгенерирован автоматически). + Запрещает ручной ввод зарезервированных префиксов. """ sku = self.cleaned_data.get('sku') @@ -26,6 +36,15 @@ class SKUUniqueMixin: return None sku = sku.strip() + + # Проверяем зарезервированные префиксы + sku_upper = sku.upper() + for prefix, entity_type in self.RESERVED_PREFIXES.items(): + if sku_upper.startswith(prefix): + raise forms.ValidationError( + f'Префикс "{prefix}" зарезервирован для автоматической генерации артикулов {entity_type}. ' + f'Пожалуйста, используйте другой артикул или оставьте поле пустым для автогенерации.' + ) # Проверяем во всех моделях models_to_check = [