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>