From e821d881a916ded05893b58bb495a42ff9cdfa70 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Wed, 29 Oct 2025 23:49:15 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B2=20=D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B2=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B5=20=D0=B2?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: при перемещении товаров стрелками вверх/вниз приоритеты изменялись только в UI, но при сохранении их значения не обновлялись в БД и возвращались в исходное состояние. Причина: после сохранения формсета в view.form_valid() вызывалась функция _recalculate_priorities(), которая перезаписывала все приоритеты по ID товаров, игнорируя значения из формсета. Решение: 1. Удалена функция _recalculate_priorities() которая перезаписывала приоритеты 2. Теперь приоритеты сохраняются напрямую из формсета (inlineformset содержит поле 'priority') 3. Улучшен JavaScript селектор в updatePriorities() для более надёжного нахождения поля priority 4. Добавлено логирование в консоль для отладки (console.log) Теперь при перемещении товаров стрелками и нажатии "Сохранить" приоритеты правильно сохраняются в БД. 🤖 Generated with Claude Code Co-Authored-By: Claude --- .../templates/products/variantgroup_form.html | 14 +++++++++++--- myproject/products/views/variant_group_views.py | 12 +----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/myproject/products/templates/products/variantgroup_form.html b/myproject/products/templates/products/variantgroup_form.html index 2f6ff3c..1074c86 100644 --- a/myproject/products/templates/products/variantgroup_form.html +++ b/myproject/products/templates/products/variantgroup_form.html @@ -293,9 +293,17 @@ document.addEventListener('DOMContentLoaded', function() { let priority = 1; container.querySelectorAll('.item-row:not([style*="display: none"])').forEach(row => { const priorityCell = row.querySelector('.item-priority'); - const priorityInput = row.querySelector('[name$="-priority"]'); - if (priorityCell) priorityCell.textContent = priority; - if (priorityInput) priorityInput.value = priority; + const priorityInput = row.querySelector('input[name$="-priority"]'); + + if (priorityCell) { + priorityCell.textContent = priority; + } + + if (priorityInput) { + priorityInput.value = priority; + console.log(`Обновлено поле приоритета: ${priorityInput.name} = ${priority}`); + } + priority++; }); } diff --git a/myproject/products/views/variant_group_views.py b/myproject/products/views/variant_group_views.py index 405f228..8256daf 100644 --- a/myproject/products/views/variant_group_views.py +++ b/myproject/products/views/variant_group_views.py @@ -170,11 +170,9 @@ class ProductVariantGroupUpdateView(LoginRequiredMixin, UpdateView): with transaction.atomic(): self.object = form.save(commit=True) items_formset.instance = self.object + # Сохраняем формсет, который содержит приоритеты установленные пользователем items_formset.save() - # Пересчитываем приоритеты после редактирования - self._recalculate_priorities(self.object) - messages.success( self.request, f'Группа вариантов "{self.object.name}" успешно обновлена!' @@ -184,14 +182,6 @@ class ProductVariantGroupUpdateView(LoginRequiredMixin, UpdateView): messages.error(self.request, f'Ошибка при сохранении: {str(e)}') return self.form_invalid(form) - @staticmethod - def _recalculate_priorities(variant_group): - """Пересчитывает приоритеты товаров в группе""" - items = variant_group.items.all().order_by('id') - for idx, item in enumerate(items, start=1): - item.priority = idx - item.save(update_fields=['priority']) - class ProductVariantGroupDeleteView(LoginRequiredMixin, DeleteView): """Удаление группы вариантов с подтверждением"""