从 Django 的视图中删除对象
Deleting object from a view in Django
我有一个显示对象列表的页面,我想在每个对象旁边添加一个按钮,使用户能够删除它。我在网上发现了一些关于类似场景的问题,但出于某种原因,当我尝试复制解决方案时,我总是遇到错误。
下面是views.py中的删除函数:
def delete_dish(request, pk):
query = Dish.objects.get_object_or_404(pk)
supermenu = query['supermenu'].pk
query.delete()
return redirect('foodmenu:menu', supermenu)
这是 HTML 模板中的表格:
{% if not supermenu.dish_set.count == 0 %}
<ul>
{% for dish in supermenu.dish_set.all %}
<li>
{{ dish.name }} - {{ dish.description }}
<form action="{% url 'foodmenu:delete_dish' dish.id %}" method="POST">
{% csrf_token %}
<button type="submit">X</button>
</form>
</li>
{% if not dish.price_set.count == 0 %}
<ul>
{% for price in dish.price_set.all %}
{% if price.label %}
<li>{{ price.label }}: {{ price.cost }}</li>
{% else %}
<li>{{ price.cost }}</li>
{% endif %}
{% endfor %}
</ul>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>No dishes on this menu!</p>
{% endif %}
这里是 urls.py:
app_name = 'foodmenu'
urlpatterns = [
...
path('dish/delete/<int:dish.id>', views.delete_dish, name="delete_dish")
]
当我单击该按钮时,浏览器转到 ./dish/delete/1(1 是对象的 pk),但 Django returns 出现 404 错误。
您应该使用 get_object_or_404
快捷方式而不是 query = Dish.objects.get_object_or_404(pk)
:
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_POST
@require_POST
def delete_dish(request, pk):
if request.method
query = get_object_or_404(Dish, pk=pk)
supermenu = query.supermenu.pk
query.delete()
return redirect('foodmenu:menu', supermenu)
同时将您的 url 模式更改为:
path('dish/delete/<int:pk>/', views.delete_dish, name="delete_dish")
UPD
正如@daniherrera 在他的评论中提到的,您可能想要检查请求的方法,以防止意外删除。为此,您可以使用 require_POST
装饰器。
我有一个显示对象列表的页面,我想在每个对象旁边添加一个按钮,使用户能够删除它。我在网上发现了一些关于类似场景的问题,但出于某种原因,当我尝试复制解决方案时,我总是遇到错误。
下面是views.py中的删除函数:
def delete_dish(request, pk):
query = Dish.objects.get_object_or_404(pk)
supermenu = query['supermenu'].pk
query.delete()
return redirect('foodmenu:menu', supermenu)
这是 HTML 模板中的表格:
{% if not supermenu.dish_set.count == 0 %}
<ul>
{% for dish in supermenu.dish_set.all %}
<li>
{{ dish.name }} - {{ dish.description }}
<form action="{% url 'foodmenu:delete_dish' dish.id %}" method="POST">
{% csrf_token %}
<button type="submit">X</button>
</form>
</li>
{% if not dish.price_set.count == 0 %}
<ul>
{% for price in dish.price_set.all %}
{% if price.label %}
<li>{{ price.label }}: {{ price.cost }}</li>
{% else %}
<li>{{ price.cost }}</li>
{% endif %}
{% endfor %}
</ul>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>No dishes on this menu!</p>
{% endif %}
这里是 urls.py:
app_name = 'foodmenu'
urlpatterns = [
...
path('dish/delete/<int:dish.id>', views.delete_dish, name="delete_dish")
]
当我单击该按钮时,浏览器转到 ./dish/delete/1(1 是对象的 pk),但 Django returns 出现 404 错误。
您应该使用 get_object_or_404
快捷方式而不是 query = Dish.objects.get_object_or_404(pk)
:
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_POST
@require_POST
def delete_dish(request, pk):
if request.method
query = get_object_or_404(Dish, pk=pk)
supermenu = query.supermenu.pk
query.delete()
return redirect('foodmenu:menu', supermenu)
同时将您的 url 模式更改为:
path('dish/delete/<int:pk>/', views.delete_dish, name="delete_dish")
UPD
正如@daniherrera 在他的评论中提到的,您可能想要检查请求的方法,以防止意外删除。为此,您可以使用 require_POST
装饰器。