django删除帖子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("nn 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')

我的网址.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中,我只有一个带有url的href来删除

<a class="dropdown-item text-danger" href="{% url 'delete_notes' notes.id %}">Delete</a>

获取;找不到参数为"(14,("的"delete_notes"的反转。尝试了1种模式:['项目/检查表/delete_notes/\Z']

不太确定遗漏了什么,以为检查表上的子弹已经通过了吗?

重定向更新

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/<int:note_id>/<slug:slug>/', delete_notes, name='delete_notes'),
@login_required
@require_http_methods(['post', 'delete'])
def delete_notes(request, note_id, slug):
'''
Delete given note
'''
del_note = Note.objects.filter(id=note_id).delete()
return redirect('task_detail', slug=slug)

更新为段塞

在html 中

<form method="POST" action="{% url 'delete_notes' notes.id title.slug %}">
{% csrf_token %}
<a class="dropdown-item">
<button type="submit"class="btn btn-danger">Delete</button>
</a>
</form>

您应该指定一个参数来放置notes.id参数,例如:

path('projects/checklist/delete_notes/<int:note_id>/', delete_notes, name='delete_notes'),

然而,这样的视图应该只通过POST或DELETE请求触发,而不是通过GET请求触发:GET请求应该只用于检索数据,而不是更改实体。

所以你用来保护视图

from django.views.decorators.http importrequire_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')

并且在模板中;"迷你形式":

<formmethod="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 importrequire_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)

然后在表单中,你应该传递任务的片段:

<form method="post" action="{% url 'delete_notes' notes.idtask.slug%}">
{% csrf_token %}
<button type="submit">Delete</button>
</form>

最新更新