Fix: сохранение даты и табличной части заказа (корректный префикс formset items-N)
Made-with: Cursor
This commit is contained in:
12
HISTORY.md
12
HISTORY.md
@@ -1,5 +1,17 @@
|
||||
# История изменений ERP WaterSurf
|
||||
|
||||
## 2025-02-25 23:45 UTC – Сохранение заказа: дата и табличная часть
|
||||
|
||||
**Проблема**: При сохранении заказа клиента не сохранялись поле «Дата» и табличная часть (товары).
|
||||
|
||||
**Причина**: В JavaScript переиндексация строк и клонирование использовали неверный формат имён полей formset: префикс в Django — `items` (related_name), имена имеют вид `items-0-product`, `items-1-price`. В коде искали `items0`, `items1` (без дефиса), из‑за чего переиндексация не срабатывала, клоны получали те же имена `items-0-*`, при отправке дубликаты перезаписывали друг друга и formset обрабатывал только одну строку. При ошибке валидации formset в контекст не передавался обновлённый formset с ошибками.
|
||||
|
||||
**Решение**: В reindexRows и при клонировании строк используется корректный формат: `prefix + '-\\d+'` для индекса (например `items-0`), замена на `prefix + '-' + i`; при клонировании — `prefix + '-\\d+-'` для совпадения с суффиксом поля. При невалидном formset в контекст передаётся `formset=formset`, чтобы на форме отображались ошибки.
|
||||
|
||||
**Изменения**: order_form.html, supplier_order_form.html (регулярные выражения в reindexRows и в обработчике «Добавить строку»), documents/views.py (передача formset в get_context_data при ошибке валидации для заказов клиента и поставщику).
|
||||
|
||||
---
|
||||
|
||||
## 2025-02-25 23:30 UTC – Поле Цена: разделители числа, без стрелок в Цена и Количество
|
||||
|
||||
**Проблема**: В поле «Цена» не было разделителей разрядов; стрелки вверх/вниз в полях «Цена» и «Количество» мешали.
|
||||
|
||||
@@ -65,7 +65,7 @@ class CustomerOrderCreate(LoginRequiredMixin, CreateView):
|
||||
logger.info("Создан заказ клиента %s", self.object)
|
||||
messages.success(self.request, "Заказ создан.")
|
||||
return redirect(self.success_url)
|
||||
return self.render_to_response(self.get_context_data(form=form))
|
||||
return self.render_to_response(self.get_context_data(form=form, formset=formset))
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.object = None
|
||||
@@ -95,7 +95,7 @@ class CustomerOrderUpdate(LoginRequiredMixin, UpdateView):
|
||||
logger.info("Обновлён заказ клиента %s", self.object)
|
||||
messages.success(self.request, "Заказ сохранён.")
|
||||
return redirect(self.success_url)
|
||||
return self.render_to_response(self.get_context_data(form=form))
|
||||
return self.render_to_response(self.get_context_data(form=form, formset=formset))
|
||||
|
||||
|
||||
class CustomerOrderDelete(LoginRequiredMixin, DeleteView):
|
||||
@@ -134,7 +134,7 @@ class SupplierOrderCreate(LoginRequiredMixin, CreateView):
|
||||
logger.info("Создан заказ поставщику %s", self.object)
|
||||
messages.success(self.request, "Заказ создан.")
|
||||
return redirect(self.success_url)
|
||||
return self.render_to_response(self.get_context_data(form=form))
|
||||
return self.render_to_response(self.get_context_data(form=form, formset=formset))
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.object = None
|
||||
@@ -164,7 +164,7 @@ class SupplierOrderUpdate(LoginRequiredMixin, UpdateView):
|
||||
logger.info("Обновлён заказ поставщику %s", self.object)
|
||||
messages.success(self.request, "Заказ сохранён.")
|
||||
return redirect(self.success_url)
|
||||
return self.render_to_response(self.get_context_data(form=form))
|
||||
return self.render_to_response(self.get_context_data(form=form, formset=formset))
|
||||
|
||||
|
||||
class SupplierOrderDelete(LoginRequiredMixin, DeleteView):
|
||||
|
||||
@@ -157,11 +157,11 @@
|
||||
row.querySelectorAll('input, select').forEach(function(el) {
|
||||
var n = el.getAttribute('name');
|
||||
if (n && n.indexOf(prefix) === 0) {
|
||||
el.setAttribute('name', n.replace(new RegExp('^' + prefix + '\\d+'), prefix + i));
|
||||
el.setAttribute('name', n.replace(new RegExp('^' + prefix + '-\\d+'), prefix + '-' + i));
|
||||
}
|
||||
var id = el.getAttribute('id');
|
||||
if (id) {
|
||||
el.setAttribute('id', id.replace(new RegExp(prefix + '\\d+'), prefix + i));
|
||||
el.setAttribute('id', id.replace(new RegExp(prefix + '-\\d+'), prefix + '-' + i));
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -188,8 +188,8 @@
|
||||
clone.querySelectorAll('input, select').forEach(function(el) {
|
||||
var name = el.getAttribute('name');
|
||||
if (name && name.indexOf(prefix) === 0) {
|
||||
el.setAttribute('name', name.replace(new RegExp('^' + prefix + '\\d+-'), prefix + nextIndex + '-'));
|
||||
el.setAttribute('id', (el.getAttribute('id') || '').replace(new RegExp(prefix + '\\d+-'), prefix + nextIndex + '-'));
|
||||
el.setAttribute('name', name.replace(new RegExp('^' + prefix + '-\\d+-'), prefix + '-' + nextIndex + '-'));
|
||||
el.setAttribute('id', (el.getAttribute('id') || '').replace(new RegExp(prefix + '-\\d+'), prefix + '-' + nextIndex));
|
||||
}
|
||||
if (el.name && el.name.indexOf('-DELETE') !== -1) {
|
||||
el.checked = false;
|
||||
|
||||
@@ -162,11 +162,11 @@
|
||||
row.querySelectorAll('input, select').forEach(function(el) {
|
||||
var n = el.getAttribute('name');
|
||||
if (n && n.indexOf(prefix) === 0) {
|
||||
el.setAttribute('name', n.replace(new RegExp('^' + prefix + '\\d+'), prefix + i));
|
||||
el.setAttribute('name', n.replace(new RegExp('^' + prefix + '-\\d+'), prefix + '-' + i));
|
||||
}
|
||||
var id = el.getAttribute('id');
|
||||
if (id) {
|
||||
el.setAttribute('id', id.replace(new RegExp(prefix + '\\d+'), prefix + i));
|
||||
el.setAttribute('id', id.replace(new RegExp(prefix + '-\\d+'), prefix + '-' + i));
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -193,8 +193,8 @@
|
||||
clone.querySelectorAll('input, select').forEach(function(el) {
|
||||
var name = el.getAttribute('name');
|
||||
if (name && name.indexOf(prefix) === 0) {
|
||||
el.setAttribute('name', name.replace(new RegExp('^' + prefix + '\\d+-'), prefix + nextIndex + '-'));
|
||||
el.setAttribute('id', (el.getAttribute('id') || '').replace(new RegExp(prefix + '\\d+-'), prefix + nextIndex + '-'));
|
||||
el.setAttribute('name', name.replace(new RegExp('^' + prefix + '-\\d+-'), prefix + '-' + nextIndex + '-'));
|
||||
el.setAttribute('id', (el.getAttribute('id') || '').replace(new RegExp(prefix + '-\\d+'), prefix + '-' + nextIndex));
|
||||
}
|
||||
if (el.name && el.name.indexOf('-id') !== -1) {
|
||||
el.value = '';
|
||||
|
||||
Reference in New Issue
Block a user