Django - кнопка удаления на форме не перенаправляет на правильный путь - PullRequest
1 голос
/ 25 апреля 2019

У меня есть HTML-шаблон, в котором размещены несколько сообщений, и его можно удалить с помощью созданной кнопки «Удалить».Мой код ищет идентификатор удаляемого элемента и удаляет его, перенаправляя в / deleteMessage и объединяя с идентификатором.Я не полностью понимаю процесс и у меня есть ошибка, которую я не могу обнаружить.

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.

Что я пробовал:

Я пытался, во взглядах.py изменяет это на g.id (вместо GuestBookItems.id), чтобы соответствовать тому, что находится в форме, но это тоже не сработало.

item_to_delete =GuestBookItem.objects.get(id=g_id)

1 Ответ

1 голос
/ 25 апреля 2019

Вам нужно захватить GuestBookItem_id в шаблоне URL:

path('deleteMessage/<int:GuestBookItem_id>/', deleteMessage),

Обратите внимание, что в Python вы обычно используете guest_book_item_id в качестве имени переменной. Или, поскольку это первичный ключ экземпляра модели, вы можете использовать pk. Было бы неплохо использовать get_object_or_404, чтобы вы получили страницу 404, когда элемент не существует.

Вы уже используете запрос POST, который является хорошей идеей при изменении или удалении объектов. Вы также должны проверить, что это POST-запрос в представлении.

Наконец, неплохо бы обратить URL-адреса вместо их жесткого кодирования. Сначала вам нужно добавить имена в шаблоны 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')
...