Как сделать правильное перенаправление в приложении django после удаления пользователем своего сообщения на сайте?

Я разрабатываю сайт, просматривая видеокурс, и иногда я не согласен с решениями наставника по решению некоторых задач. И пока я пытаюсь разобраться в этом, проблема уже заняла очень много времени, а я все еще не нашел, как ее решить.

Сначала я показываю необходимый исходный код.

  1. urls.py and the the error url:
    path('delete-message/<str:pk>/', views.delete_message, name='delete-message')
  1. views.py and function where error happens:
@login_required
def delete_message(request, pk):
    message = Message.objects.get(id=pk)
    room_id = message.room.id

    if request.method == 'POST':
        message.delete()
        return redirect(f'room/{room_id}') ### WHAT DO I HAVE TO DO ???

    return render(request, 'delete-message.html')
  1. delete-message.html and error form:
<form method="POST">
    {% csrf_token %}
    <h2>
        <p>Are you sure you want to delete this message ?</p>
    </h2>
    <a href="{{request.META.HTTP_REFERER}}">Go Back</a>
    <input type="submit" value="Confirm">
</form>

После того, как redirect() работает, он отправляет меня на несуществующий url: 127.0.0.1:8000/delete-message/10/room/5 Но это должно было быть http://127.0.0.1:8000/room/5... Почему это не такой результат, как я ожидал?

Также я пытался сделать следующее:

  1. In the views.py I change function where except of redirect I transfer room_id to the template:
@login_required
def delete_message(request, pk):
    message = Message.objects.get(id=pk)
    room_id = message.room.id

    if request.method == 'POST':
        message.delete()

    return render(request, 'delete-message.html', {'id': room_id})
  1. In the template delete-message.html I try to redirect back to the room by the "action" attribute:

И этот метод также возвращает ошибку:

IntegrityError at /room/5/
NOT NULL constraint failed: BaseApp_message.body

Вы можете использовать reverse с пробелом в имени url, как показано ниже :-

urls.py

path('room/<str:pk>/', views.room_message, name='room')

Тогда в вашем представлении будет :-

@login_required
def delete_message(request, pk):
    message = Message.objects.get(id=pk)
    room_id = message.room.id

    if request.method == 'POST':
        message.delete()
        url = reverse('room', kwargs={'id': room_id})
        return HttpResponseRedirect(url)

Для перенаправления на URL, относящийся к корню, добавьте ведущую прямую косую черту:

# return redirect(f'room/{room_id}')
return redirect(f'/room/{room_id}')
Вернуться на верх