Как сделать правильное перенаправление в приложении django после удаления пользователем своего сообщения на сайте?
Я разрабатываю сайт, просматривая видеокурс, и иногда я не согласен с решениями наставника по решению некоторых задач. И пока я пытаюсь разобраться в этом, проблема уже заняла очень много времени, а я все еще не нашел, как ее решить.
Сначала я показываю необходимый исходный код.
- urls.py and the the error url:
path('delete-message/<str:pk>/', views.delete_message, name='delete-message')
- 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')
- 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
...
Почему это не такой результат, как я ожидал?
Также я пытался сделать следующее:
- 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})
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}')