我有一个html模板,上面张贴了多则消息,可以使用已创建的“删除”按钮将其删除。我的代码试图搜索要删除的项目的ID并将其删除,然后重定向到/ deleteMessage并与ID号串联。我不完全了解该过程,并且发现了一个我找不到的错误。
html表单
<ul>
{% for g in all_items %}
<li> {{ g.content }}
<form action="/deleteMessage/{{g.id}}/"
style="display: inline;"
method="post">{% csrf_token %}
<input type="submit" value="Delete"/>
</form>
</li>
{% endfor %}
</ul>
views.py相关代码
def deleteMessage(request,GuestBookItem_id):
item_to_delete =GuestBookItem.objects.get(id=GuestBookItem_id)
item_to_delete.delete()
return HttpResponseRedirect('/worldguestbook/')
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('worldguestbook/',worldguestbookView),
path('login/',loginView),
path('addMessage/',addMessage),
path('deleteMessage/',deleteMessage),
]
我想这是导致错误的那行-连接错误,而不是重定向到正确的路径。
**<form action="/deleteMessage/{{g.id}}/"**
错误消息:
Page not found (404)
Request Method: POST
Request URL: http://127.0.0.1:8000/deleteMessage/17/
Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order:
admin/
worldguestbook/
login/
addMessage/
deleteMessage/
The current path, deleteMessage/17/, didn't match any of these.
我尝试过的事情:
我尝试在views.py中将其更改为g.id(而不是GuestBookItems.id)以与表单中的内容匹配,但这也不起作用。
item_to_delete =GuestBookItem.objects.get(id=g_id)
答案 0 :(得分:1)
您需要使用以下网址格式捕获GuestBookItem_id
:
path('deleteMessage/<int:GuestBookItem_id>/', deleteMessage),
请注意,在Python中,通常将guest_book_item_id
用作变量名。或者,因为它是模型实例的主键,所以您可以使用pk
。使用get_object_or_404
是个好主意,这样当该项目不存在时,您会得到一个404页面。
您已经在使用POST
请求,当您更改或删除对象时,这是一个好主意。您还应该在视图中检查它是否为POST请求。
最后,最好reverse URLs而不是对其进行硬编码。首先,您需要在URL模式中添加名称,然后可以在模板中使用{% url %}
,在模板中使用reverse()
或redirect
快捷方式。
将它们放在一起,您将得到:
<form action="{% url 'delete_message' g.id %}">
urlpatterns = [
path('admin/', admin.site.urls),
path('worldguestbook/', worldguestbookView, name="worldguestbook"),
path('login/', loginView, name="login"),
path('addMessage/', addMessage, name="add_message"),
path('deleteMessage/', deleteMessage, name="delete_message"),
]
path('deleteMessage/<int:pk>/', deleteMessage),
from django.shortcuts import get_object_or_404, redirect
def deleteMessage(request, pk):
if request.method == "POST"
item_to_delete = get_object_or_404(GuestBookItem, pk=pk)
item_to_delete.delete()
return redirect('worldguestbook')