Django: Изменение поля модели в базе данных при нажатии на кнопку

Я создаю веб-приложение для пиццерии. Нужно добавить действие: при нажатии на кнопку "Заказ доставлен" статус заказа должен меняться на "Заказ выполнен". Как это сделать? Необходимо, чтобы при нажатии на кнопку поле статуса в заказе менялось

models.py:

views.py:

from django.shortcuts import render
 
from django.http import HttpResponse
from django.views.generic.base import RedirectView
 
from .models import OrderPizzaWithPrice, Product, Pizza ,Courier, OrderPizza, Technology_card
 
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
 
def index(request):
    return HttpResponse('Hello!')
 
class OrderView(ListView):
    model = OrderPizzaWithPrice
    template_name = 'mainapp/listOrder.html'
    context_object_name = "orders_list"
    ordering = ['-id']
 
    def get_context_data(self,*,object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context['orders_list'] = OrderPizzaWithPrice.objects.all()
        return context
 
class ProductView(ListView):
    model = Product
    template_name = 'mainapp/listProducts.html'
    context_object_name = "product_list"
    ordering = ['-id']
 
    def get_context_data(self,*,object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context['product_list'] = Product.objects.all()
        return context
 
    def upload(request):
        if request.method == 'POST':
            
            return RedirectView('home')

listOrder.html:

{% extends 'base.html' %}
{% block title %}Orders{% endblock %}
{% block content %}      
            
                    {% for i in orders_list %}
                    <table style="border:1px solid #000000">
                        <tr><td>Имя</td><td>{{i.order.name}}</td></tr>
                        <tr><td>Фамилия</td><td>{{i.order.surname}}</td></tr>
                        <tr><td>Телефон</td><td>{{i.order.phone_number}}</td></tr>
                        <tr><td>Адрес</td><td>{{i.order.adress}}</td></tr>
                        <tr><td>Заказ</td><td>
                            {% for n in i.order.order.all %}
                                {{n.title}}
                            {% endfor %}                            
                        </td></tr>
                        <tr><td>Стоимость</td><td>{{i.price}}</td></tr>
                        <tr><td>Курьер</td><td>{{i.order.courier}}</td></tr>
                        <tr><td>Статус</td><td>{{i.order.status}}</td></tr>
                        <tr><td>
                            <form method="post">
                                <button type="submit">Заказ доставлен</button>
                            </form>
                        </td><tr>
                    </table>
                    {% endfor %}        
{% endblock %}

Это демо-версия трекера заказов :--

def order_tracker(request):
    if request.method=="POST":
        orderId = request.POST.get('orderId', '')
        try:
            order=OrderPizza.objects.get(pk=orderId)
            if OrderPizza.status == 'processing':
                OrderPizza.status = 'scheduled'
                order.save()
            return JsonResponse({'status' : OrderPizza.status})
        except: OrderPizza.DoesNotExist:
            return JsonResponse({})
    return render(request,"your_page.html")

Модификация части формы

<form method="post" action="{% url 'pizza_order_delivered_url' %}">
     <input type="hidden" name= "order_id" value="{{ i.pk }}">
     <button type="submit">Заказ доставлен</button>
 </form>

Просмотр части

def pizza_order_delived(request):
    if request.method=="POST":
        order_id = request.POST.get('order_id', 0)
        try:
            order=OrderPizza.objects.get(pk=order_id)
            order.status = 'Доставляется' # STATUS_DELIVERED
            order.save()
    
        except OrderPizza.DoesNotExist:
            pass
        return HttpResponseRedirect(reverse('your_order_list_url'))
    else:
        # use message to display error to user
        return HttpResponseRedirect(reverse('your_order_list_url'))

Вы должны сделать запрос на почту к вашему OrderView. Например,

class OrderView(ListView):
    model = OrderPizzaWithPrice
    template_name = 'mainapp/listOrder.html'
    context_object_name = "orders_list"
    ordering = ['-id']
    
    def post(self,request):
        order = get_object_or_404(OrderPizza, id=request.POST.get('order_id'))
        order.status = "Order completed"
        order.save()
        context = self.get_context_data()
        return render(request, template_name, context)
        

В вашем listOrder.html:

<form method="post" action="order_view_url">
  <input type="hidden" name="order_id" value="{{i.order.order.id}}"/>
  <button type="submit">Заказ доставлен</button>
</form>
Вернуться на верх