Django delete post noReverseMatch
Пытаюсь удалить сообщение, но почему-то получаю NoReverseMatch
views.py
@login_required
def task_detail(request, slug):
'''
Detailed view of all tasks on given project
'''
context = {}
checklist = get_object_or_404(Checklist, slug=slug)
context.update({'checklist':checklist})
form = NotesForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
print("\n\n for is valid")
author = Profile.objects.get(user=request.user)
new_note = form.save(commit=False)
new_note.user = author
new_note.checklist = checklist
new_note.save()
return redirect('task_detail', slug=slug)
context.update({
'form': form,
'title': checklist,
})
return render(request, 'projects/checklist.html', context)
@login_required
def delete_notes(request, note_id = None):
del_note = Note.objects.get(id = note_id)
del_note.delete()
return redirect('teams')
Мой urls.py
urlpatterns = [
path('projects/', teams, name='teams'),
path('projects/project/<slug>/', projects, name='projects'),
path('projects/tasks/<slug>/', project_detail, name='project_detail'),
path('projects/checklist/<slug>/', task_detail, name='task_detail'),
path('projects/checklist/delete_notes/', delete_notes, name='delete_notes'),
]
в html у меня просто href с url для удаления
<a class="dropdown-item text-danger" href="{% url 'delete_notes' notes.id %}">Delete</a>
Getting; Reverse for 'delete_notes' with arguments '(14,)' not found. Проверено 1 шаблон(ы): ['projects/checklist/delete_notes/\Z']
Не совсем понимаю, чего не хватает, думал, что слизень из контрольного списка уже пройден?
Вы должны указать параметр, куда поместить параметр notes.id, например:
path('projects/checklist/delete_notes/<int:note_id>/', delete_notes, name='delete_notes'),
Однако такое представление должно быть вызвано только запросом POST или DELETE, а не GET: запрос GET должен использоваться только для получения данных, а не для изменения сущностей.
Итак, вы защищаете вид с помощью:
from django.views.decorators.http import require_http_methods
@login_required
@require_http_methods(['POST', 'DELETE'])
def delete_notes(request, note_id):
Note.objects.filter(id=note_id).delete()
return redirect('teams')
а в шаблоне нужно работать с "мини-формой":
<form method="post" action="{% url 'delete_notes' notes.id %}">
{% csrf_token %}
<button type="submit">Delete</button>
</form>
Если вы хотите перенаправить на task_detail данной задачи, вы можете добавить дополнительный параметр:
path('projects/checklist/delete_notes/<int:note_id>/<slug:slug>/', delete_notes, name='delete_notes'),
и перенаправить с помощью:
from django.views.decorators.http import require_http_methods
@login_required
@require_http_methods(['POST', 'DELETE'])
def delete_notes(request, note_id, slug):
Note.objects.filter(id=note_id).delete()
return redirect('task_detail', slug=slug)
затем в форме необходимо передать slug задания:
<form method="post" action="{% url 'delete_notes' notes.id task.slug %}">
{% csrf_token %}
<button type="submit">Delete</button>
</form>