Django-表单上的删除按钮未重定向到正确的路径

时间:2019-04-25 19:03:07

标签: django forms button id

我有一个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)

1 个答案:

答案 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')