- Когда акция поступит в продажу, ей будет присвоен автоматически сгенерированный номер лота, а также номер единицы и комплекты единиц.
- При добавлении продажи я использовал htmx, чтобы предоставить раскрывающийся список LOT на основе выбранного товара. Этот inturn дает значения-заполнители для номера единицы и доступных пакетов единиц, чтобы количество продаж не превышало числа для конкретного номера LOT.
Проблемная область: при добавлении продажи я предоставил форму, которая динамически предоставляет раскрывающиеся списки и отправляет продажу одним нажатием кнопки. проблема возникает, когда я добавляю несколько форм продаж на одной странице. значения раскрывающегося списка переходят в разные формы и там неправильное число. Мне удалось изолировать номера ITEM и LOT, используя уникальные идентификаторы для конкретной формы, но номера единиц и пакеты единиц не работают, когда я использую уникальные номера, поскольку они сбрасываются до нуля, когда htmx вызывает изменение.
@login_required
@permission_required('delivery.can_view_items', raise_exception=True)
def add_sales(request):
form = SalesForm()
unique_id = uuid.uuid4().hex # Generate a unique identifier for the form instance
# Detect HTMX GET requests
if request.method == "GET" and request.headers.get("HX-Request") == "true":
items = Inventory.objects.filter(id__in=Stock.objects.filter(Q(unit_numbers__gt=0) | Q(unit_bundles__gt=0)).values_list('item_id', flat=True).distinct())
companies = Customer.objects.all()
context = {'items': items, 'companies': companies, 'form': form, 'unique_id': unique_id}
return render(request, "delivery/partials/addsaleform.html", context)
# Normal GET: show full page
if request.method == "GET":
items = Inventory.objects.filter(id__in=Stock.objects.filter(Q(unit_numbers__gt=0) | Q(unit_bundles__gt=0)).values_list('item_id', flat=True).distinct())
companies = Customer.objects.all()
context = {'items': items, 'companies': companies, 'form': form, 'unique_id': unique_id}
return render(request, 'delivery/add_sales.html', context)
if request.method == "POST":
try:
data = request.POST
inventory_id = data.get('item')
lot_number = data.get('lot', None)
unit_numbers = int(data.get('unit_number', 0))
unit_bundles = int(data.get('unit_bundle', 0))
company = data.get('company', None)
# Get the Inventory object (if you need it)
inventory_obj = get_object_or_404(Inventory, id=inventory_id)
# Then get a Stock instance that refers to that inventory
# For example, you might pick the first available stock entry:
stock_obj = Stock.objects.filter(LOT_number=lot_number, item=inventory_obj).first()
if not stock_obj:
raise ValueError(f"No stock found for Inventory id {inventory_id}")
stock_obj.unit_numbers -= unit_numbers
stock_obj.unit_bundles -= unit_bundles
stock_obj.save()
# Create the Sale pointing to the stock_obj
sale = Sale(
item=stock_obj,
LOT_number=lot_number,
unit_numbers=unit_numbers,
unit_bundles=unit_bundles,
user=request.user,
company=company,
sale_date=now()
)
sale.save()
messages.success(request, "Sale added successfully.")
return redirect('sales')
except Exception as e:
messages.error(request, f"Failed to add sale: {e}")
return redirect('add_sales')
else:
form = SalesForm()
return render(request, 'delivery/add_sales.html', {'form': form})
Приведенный ниже шаблон вызывает форму, которая хранится в виде частичных файлов.
Add Sales
{% include 'delivery/partials/addsaleform.html'%}
+ Add Sales
Submit All
Мобильная версия