Select 下拉列表中的数据并将其保存到 Django 中的数据库中
Select data from drop-down list and save it to database in Django
我是 Django 的新手。我想在下拉列表选项中显示 food_status,因此厨师可以 select 其中之一,更改它,并将其更新到数据库中。它可以更新到数据库中,但我不确定如何根据我在 models.py 中的 food_status 在模板上显示下拉列表。
有人知道怎么做吗?
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 see_order(request):
if request.method == "POST":
OrderId = request.POST.get("OrderId")
customerOrder = OrderItem(OrderId=OrderId)
so = OrderItem.objects.filter(OrderId=OrderId)
return render(request, 'restaurants/see_order.html', {'so': so})
else:
return render(request, 'restaurants/customer_page.html')
see_order.html
<form action="#" method="post">
<style>
table, th, td {
border: 1px solid black;
table-layout: fixed ;
height: "2000" ;
width: "2000" ;
}
</style>
{% csrf_token %}
{% for order in so %}
<table>
<tr>
<th>Table Number</th>
<th>Item</th>
<th>Quantity</th>
<th>Status</th>
<th>Order Id</th>
</tr>
<tr>
<td>{{ order.Table_No }}</td>
<td>{{ order.Item }}</td>
<td>{{ order.Qty }}</td>
<td>{{ order.food_status }}</td>
<td>{{ order.OrderId }}</td>
</tr>
{% endfor %}
</table>
<br><input action="action" onclick="window.history.go(-1); return false;" type="button" value="Back"></br>
</form>
kitchen_page 模板应显示下拉列表,然后厨师可以从该下拉列表中选择 food_status,单击保存按钮,并更新数据库。
尝试使用 Django 字段的 choices
属性 https://docs.djangoproject.com/en/2.0/ref/models/fields/#choices
您可以使用 {% for %}
循环和 FoodStatus
选择列表呈现选择,如下所示:
<td>
{{ order.get_food_status_display }}
<select name="food_status">
{% for id, choice in order.FoodStatus %}
<option value="{{ id }}"{% if order.food_status == id %} selected="selected"{% endif %}>{{ choice }}</option>
{% endfor %}
</select>
</td>
您可以使用 get_FOO_display
方法显示实际状态文本(而不是 id)。
添加了 {% if %}
标签以预选正确的选项。
考虑切换到 Forms
以便它可以自动处理渲染字段。(!!!)
考虑将 food_status
改为 IntegerField
。提供 default
属性,因此它始终是选项之一,即使未指定。
我是 Django 的新手。我想在下拉列表选项中显示 food_status,因此厨师可以 select 其中之一,更改它,并将其更新到数据库中。它可以更新到数据库中,但我不确定如何根据我在 models.py 中的 food_status 在模板上显示下拉列表。
有人知道怎么做吗?
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 see_order(request):
if request.method == "POST":
OrderId = request.POST.get("OrderId")
customerOrder = OrderItem(OrderId=OrderId)
so = OrderItem.objects.filter(OrderId=OrderId)
return render(request, 'restaurants/see_order.html', {'so': so})
else:
return render(request, 'restaurants/customer_page.html')
see_order.html
<form action="#" method="post">
<style>
table, th, td {
border: 1px solid black;
table-layout: fixed ;
height: "2000" ;
width: "2000" ;
}
</style>
{% csrf_token %}
{% for order in so %}
<table>
<tr>
<th>Table Number</th>
<th>Item</th>
<th>Quantity</th>
<th>Status</th>
<th>Order Id</th>
</tr>
<tr>
<td>{{ order.Table_No }}</td>
<td>{{ order.Item }}</td>
<td>{{ order.Qty }}</td>
<td>{{ order.food_status }}</td>
<td>{{ order.OrderId }}</td>
</tr>
{% endfor %}
</table>
<br><input action="action" onclick="window.history.go(-1); return false;" type="button" value="Back"></br>
</form>
kitchen_page 模板应显示下拉列表,然后厨师可以从该下拉列表中选择 food_status,单击保存按钮,并更新数据库。
尝试使用 Django 字段的 choices
属性 https://docs.djangoproject.com/en/2.0/ref/models/fields/#choices
您可以使用 {% for %}
循环和 FoodStatus
选择列表呈现选择,如下所示:
<td>
{{ order.get_food_status_display }}
<select name="food_status">
{% for id, choice in order.FoodStatus %}
<option value="{{ id }}"{% if order.food_status == id %} selected="selected"{% endif %}>{{ choice }}</option>
{% endfor %}
</select>
</td>
您可以使用 get_FOO_display
方法显示实际状态文本(而不是 id)。
添加了 {% if %}
标签以预选正确的选项。
考虑切换到 Forms
以便它可以自动处理渲染字段。(!!!)
考虑将 food_status
改为 IntegerField
。提供 default
属性,因此它始终是选项之一,即使未指定。