【问题标题】:Django .delete() does not workDjango .delete() 不起作用
【发布时间】:2014-09-28 17:40:01
【问题描述】:

我正在用 Django 做一个简单的 bbs。

目前,我正在尝试在前端删除帖子。

这是我在views.py中的代码

@login_required
def delete_post(request, id):
    post_to_delete = get_object_or_404(Post, pk=id)

    if post_to_delete.owner_user != request.user:
        return HttpResponseForbidden()

    if request.method == 'POST':
        form = DeletePostForm(request.POST, instance=post_to_delete)
        if form.is_valid():
            post_to_delete.delete()

            return HttpResponseRedirect('/') 
    else:
        form = DeletePostForm(instance=post_to_delete)

    return render(request,'delete_post.html', {'form':form})

我相信我正确使用了 .delete() 函数,当我单击删除按钮时,我被带到 delete_post.html 但是当我返回查看管理员中的帖子列表时,帖子仍然存在..

【问题讨论】:

  • 您需要检查您对 form.is_valid() 的调用是否返回 True。如果您不知道,您可以使用 form.errors 看到错误,而且我不知道您为什么使用 Form 执行删除,只需将帖子 ID 传递给视图并获取它,您就可以删除它。跨度>
  • stackoverflow.com/a/13644671我在这里看到了..它告诉我使用表单来避免csrf攻击。
  • 你不需要使用表单来避免csrf攻击,因为Django会为你处理它,你可以查看它是如何工作的:docs.djangoproject.com/en/dev/ref/contrib/csrf/…
  • 只是为了确保,如果我在我的 def delete_post 之上添加@csrf_protect,我将获得自动 csrf 保护?

标签: python django


【解决方案1】:

好的,在向您解释您不需要表单来删除实例之后。让我给你一个不使用表格的版本。

@login_required
def delete_post(request, id):
    post_to_delete = get_object_or_404(Post, pk=id)

    if post_to_delete.owner_user != request.user:
        return HttpResponseForbidden()

    if request.method == 'POST':   
        post_to_delete.delete()
        return render(request,'delete_post.html', {'deleted':True})

    return render(request,'delete_post.html', {'deleted':False})

您可以在模板中随意使用deleted var。

【讨论】:

  • 我实现了你所写的内容,但没有检查请求是否为 POST.. 不知何故这不起作用.. 我想我稍后会弄清楚
  • @Dan 您应该检查是否是 POST,因为 Delete 是 POST 操作,这是一个好习惯。请记住,GET 请求用于从您的应用中检索信息,POST 请求用于修改它。
猜你喜欢
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2012-11-03
相关资源
最近更新 更多