Django - Отмена одной доставки, но при отмене одной доставки отменяются все доставки

Я пытаюсь отменить одну "размещенную" доставку, когда пользователь нажимает на кнопку "отменить", но он отменяет все размещенные доставки, ниже приведен views.py

просмотров

def current_delivery_page(request):
deliveries = Delivery.objects.filter(
    restaurant = request.user.restaurant,
    status_of_delivery__in=[
        Delivery.DELIVERY_DELIVERING,
        Delivery.DELIVERY_POSTED
    ]
)

delivery = Delivery.objects.all()

for a in delivery:
    if request.method == 'POST' and request.POST['receipt_number']:
        a.status_of_delivery = Delivery.DELIVERY_CANCELLED
        a.save()

return render(request, 'restaurant/deliveries.html',
{
    "deliveries": deliveries
})

html

{% if d.status_of_delivery == 'posted' %}
     <form method="POST">
        {% csrf_token %}
        <button type="submit" class="btn btn-danger" 
          name="update">Cancel</button>
        <input type="hidden" value="{{ d.receipt_number }}" 
          name="receipt_number">
      </form>
{% endif %}

модели

Вот список поставок

Я хочу отменить одну доставку, а она автоматически переходит на страницу "Выполненные/отмененные доставки". Любая помощь будет принята с благодарностью, спасибо.

Необходимо проверить, равен ли receipt_numer из POST экземпляру доставки receipt_number

for a in delivery:
    if request.method == 'POST' and request.POST['receipt_number'] == a.receipt_number:
        a.status_of_delivery = Delivery.DELIVERY_CANCELLED
        a.save()

вы перебираете все Delivery экземпляры в базе данных и устанавливаете все их статусы в DELIVERY_CANCELED в вашем for a in delivery цикле.

Вам нужно использовать Delivery.objects.get(pk=request.POST.get('receipt_number')) для получения нужного экземпляра доставки, а затем установить его статус на отмененный. Вы можете сделать что-то вроде этого:

if request.method == 'POST':
    delivery = get_object_or_404(Delivery, pk=request.POST.get('receipt_number'))
    if delivery:
        delivery.status_of_delivery = Delivery.DELIVERY_CANCELED
        delivery.save()
Вернуться на верх