Счетчик forloop с помощью htmx django
Следуя учебникам, мне удалось сделать форму, которая добавляет элементы заказа с помощью htmx. Каждый новый пункт заказа - это строка div, а не строка таблицы. У меня также есть счетчик forloop для каждой строки, но после добавления новой позиции заказа счетчик не обновляется динамически, только после обновления страницы.
Связанный (как я думаю) код:
order-create-update.html:
{% extends 'partials/base.html' %}
{% block content %}
<style>
.orderitem-form {
border-bottom: 1px solid black;
}
</style>
<div class="container-fluid" style="margin-top:80px">
{% include 'orders/order_form_full.html' %}
<hr>
<div class="row" style="margin-bottom:5px; border-bottom-style:solid; border-bottom-width:1px">
<div class="col-1" style="font-weight: bold">Item #</div>
<div class="col-2" style="font-weight: bold">Material Category</div>
<div class="col-2" style="font-weight: bold">Material Subcategory</div>
<div class="col-4" style="font-weight: bold">Material</div>
<div class="col-1" style="font-weight: bold">Quantity</div>
<div class="col-1" style="font-weight: bold">Price/Unit</div>
<div class="col-1" style="font-weight: bold">Action</div>
</div>
{% for orderitem in object.get_orderitems_children %}
{% include "orders/order_item_inline.html" with object=orderitem %}
{% endfor %}
{% if new_orderitem_url %}
<div id="orderitem-create"></div>
{% endif %}
<button type="button" class="btn btn-secondary" hx-get="{{ new_orderitem_url }}" hx-trigger="click" hx-target="#orderitem-create" hx-swap="beforeend">Add order item</button>
</div>
{% endblock %}
order_item_inline.html:
<div id="orderitem-{{ object.id }}">
<div class="row mt-1">
<div class="col-1">{{ forloop.counter }}</div>
<div class="col-2">{{ object.material_category }}</div>
<div class="col-2">{{ object.material_subcategory }}</div>
<div class="col-4">{{ object.material }}</div>
<div class="col-1">{{ object.quantity_ordered }}</div>
<div class="col-1">{{ object.material.price }}</div>
<div class="col-1">
<button type="button" class="btn btn-secondary btn-sm" hx-trigger="click" hx-get="{{ object.get_hx_edit_url }}" hx-target="#orderitem-{{ object.id }}">Edit</button>
</div>
</div>
</div>
Чего-то не хватает, но после поисков ответа в течение нескольких дней я не могу понять...
Спасибо за помощь.
Попробуйте вместо этого поместить сюда счетчик цикла forloop:
{% for orderitem in object.get_orderitems_children %}
{{ forloop.counter }}
{% include "orders/order_item_inline.html" with object=orderitem %}
{% endfor %}
Я понимаю, что это не будет выглядеть правильно, но если это работает, то должно быть легко изменить шаблоны для достижения желаемого вида.
Вы можете использовать hx-vals для динамического добавления существующего счетчика рядов в качестве параметра GET и вычисления на его основе нового числа. Вам придется использовать версию js для динамического подсчета количества рядов, что не должно быть сложно с ванильным js.
Хотя у вас возникнут проблемы, если учесть, что в будущем вы также захотите удалять строки. Вы можете быть вынуждены заново генерировать все элементы при каждом добавлении нового.