Обновление данных в базе данных на основе идентификатора заказа в Django - PullRequest
0 голосов
/ 14 мая 2019

Я новичок в Джанго.Я хочу обновить значение в базе данных на основе идентификатора заказа.Поэтому каждый идентификатор заказа имеет разные обновления.Но я могу обновить только последний элемент, добавленный в заказ.И все предыдущие заказы, которые у меня есть, будут непосредственно следовать обновлению с последнего элемента.

models.py

 class OrderItem(models.Model):
     Table_No = models.IntegerField(blank=False)
     FoodId = models.TextField()
     Item = models.TextField()
     Qty = models.DecimalField(max_digits=5, decimal_places=0)
     Price = models.DecimalField(max_digits=10, decimal_places=2)
     TotalPrice = models.TextField()
     Note = models.TextField(max_length=100, null=True)
     OrderId = models.TextField(max_length=5, null=True)

     FoodStatus = (
         ('1', 'Has been ordered'),
         ('2', 'cooked'),
         ('3', 'ready to be served'),
         ('4', 'done'),
     )
     food_status = models.CharField(max_length=50, choices=FoodStatus)

views.py

def kitchen_view(request):
    chef_view = OrderItem.objects.all()
    if request.method == "POST":
        order_id = request.POST.get("OrderId")
        status = OrderItem.objects.filter(OrderId=request.POST.get("OrderId")) 
        status.status1 = OrderItem.objects.update(food_status=request.POST.get("food_status"))
    return render(request, 'restaurants/kitchen_page.html', {'chef_view': chef_view})

kitchen_page.html

<form action="#" method="post">
    <style>
    table, th, td {
        border: 1px solid black;
    }
    </style>
        {% csrf_token %}                
        {% for order in chef_view %}    
            <table width="800">
                <tr>
                    <th width="800">Table Number</th>           
                    <th width="800">Item</th>                   
                    <th width="800">Quantity</th>               
                    <th width="800">Price</th>                  
                    <th width="800">Note</th>                   
                    <th width="800">Order Id</th>               
                    <th width="800">Status</th>                 
                </tr>
                <tr>
                    <td width="800">{{ order.Table_No }}</td>   
                    <td width="800">{{ order.Item }}</td>       
                    <td width="800">{{ order.Qty }}</td>    
                    <td width="800">{{ order.Price }}</td>      
                    <td width="800">{{ order.Note }}</td>       
                    <td width="800">{{ order.OrderId }}</td>    
                    <td width="800">{{ order.food_status }}     
                        <input type="text" name="food_status">
                </tr>
            </table>
        {% endfor %}
        <br><a href='' button onclick="myFunction()"><input type="submit" value="Change Status"></button>
    </form>

Результат должен быть в состоянии обновитьfood_status на основе идентификатора заказа.Поэтому у каждого order_id может быть свой food_status и показывать его шаблону.

Кто-нибудь может помочь мне решить эту проблему?Мне действительно нужна помощь, чтобы решить эту проблему.Очень ценю.

Ответы [ 3 ]

1 голос
/ 14 мая 2019

Хорошо, поэтому реальная проблема в том, что ваша форма неверна - вы не отправляете OrderId для просмотра. Вот быстрое исправление к этому:

kitchen_page.html:

<style>
    table, th, td {
        border: 1px solid black;
    }
</style>
<form action="#" method="post">
    <table width="800">
        <tr>
            <th width="800">Table Number</th>
            <th width="800">Item</th>
            <th width="800">Quantity</th>
            <th width="800">Price</th>
            <th width="800">Note</th>
            <th width="800">Order Id</th>
            <th width="800">Status</th>
        </tr>
        {% csrf_token %}
        {% for order in chef_view %}
            <tr>
                <td width="800">{{ order.Table_No }}</td>
                <td width="800">{{ order.Item }}</td>
                <td width="800">{{ order.Qty }}</td>
                <td width="800">{{ order.Price }}</td>
                <td width="800">{{ order.Note }}</td>
                <td width="800">{{ order.OrderId }}</td>
                <td width="800">{{ order.food_status }}
                    <input type="text" name="food_status" value="{{ order.food_status }}">
            </tr>
            <input type="hidden" name="OrderId" value="{{ order.OrderId }}">
        {% endfor %}
    </table>
    <br><button type="submit" value="Change Status">Change Status</button>
</form>

views.py:

def kitchen_view(request):
    if request.method == "POST":
        order_ids = request.POST.getlist("OrderId")
        food_statuses = request.POST.getlist("food_status")
        for i in range(len(order_ids)):
            OrderItem.objects.filter(OrderId=order_ids[i]).update(food_status=food_statuses[i])
    chef_view = OrderItem.objects.all()
    return render(request, 'restaurants/kitchen_page.html', {'chef_view': chef_view})
1 голос
/ 14 мая 2019

Ранее сохраненные отфильтрованные объекты не обновляются, поскольку у вас есть

status = OrderItem.objects.filter(OrderId=request.POST.get("OrderId"))

, но когда вы обновляете их, вы должны обновить уже отфильтрованные объекты, например

status = status.update(food_status=request.POST.get("food_status"))

Надеюсь, этопомогает.

0 голосов
/ 14 мая 2019

Вы можете обновить несколько объектов одновременно, включая фильтр в одну строку, как:

status = OrderItem.objects.filter(OrderId=request.POST.get("OrderId")).update(food_status=request.POST.get("food_status"))

Проблема в вашем коде:

status.status1 = OrderItem.objects.update(food_status=request.POST.get("food_status"))
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * UK * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.
...