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>
Вернуться на верх