【问题标题】:django delete post noReverseMatchdjango 删除帖子 noReverseMatch
【发布时间】:2022-01-25 20:37:06
【问题描述】:

试图删除帖子,但不知何故得到了 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 中我只有一个带有要删除的 url 的 href

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

得到;未找到带有参数“(14,)”的“delete_notes”的反向操作。尝试了 1 种模式:['projects/checklist/delete_notes/\Z']

不太确定缺少什么,认为清单中的 slug 已经通过了吗?

重定向更新

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>

【问题讨论】:

    标签: python html django django-views django-urls


    【解决方案1】:

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

    path('projects/checklist/delete_notes/<strong>&lt;int:note_id&gt;</strong>/', 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/<strong>&lt;int:note_id&gt;</strong>/<strong>&lt;slug:slug&gt;</strong>/', 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>

    【讨论】:

    • 成功了,谢谢。但是我在视图中重定向。我如何设法重定向到 task_detail,传递一个 slug?
    • @MerrinX: 那么你应该添加一个额外的&lt;slug:slug&gt; 参数,并重定向到return redirect('task_detail', slug=slug)
    • 你能举个例子吗
    • @MerrinX:见编辑。 task.slug 当然应该是一个获取给定任务的 slug 的表达式。如果你使用task_detail来渲染模板,那么它就是title.slug
    • 重定向现在的问题是它抛出了 id projects/checklist/delete_notes/17/keep-whitin-project/ 并且那里没有页面..
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2021-07-09
    • 2020-08-22
    • 2020-05-19
    • 2019-09-28
    • 2017-10-05
    相关资源
    最近更新 更多