【问题标题】:Delete objects in Django via html link通过 html 链接删除 Django 中的对象
【发布时间】:2014-10-02 02:51:30
【问题描述】:

我有一个带有 Post 模型的项目,即基本帖子。我想在每个帖子页面上创建一个链接,以便能够删除该帖子(具有适当的安全性)。

关于堆栈溢出有几个问题,但我似乎找不到一个完整、可行的答案(我使用的是 Django 1.7),在我实现它时不会引发错误。

我已经能够实现一个可以正常工作的删除功能,但需要添加一个带有 CSRF 令牌的 POST 表单以进行验证,并检查删除它的用户是否是创建它的用户。我似乎无法弄清楚如何添加这两个。

到目前为止,在我看来.py:

def delete(request, id):
    post = Post.objects.filter(pk=id).delete()
    return HttpResponseRedirect(reverse('posts.views.all_posts'))

在 urls.py 中:

url(r'^delete/(?P<id>\d+)/$','posts.views.delete'),

在html中:

<a href="/delete/{{ post.id }}">Delete</a>

这一切都有效,但没有安全性 - 所以感谢有关如何添加表单和检查的指导。

另外,我看到了一个使用 DeleteView 的答案,但也无法使用它。

【问题讨论】:

  • 我只是想澄清一下用户是否需要登录才能查看所有帖子?

标签: django


【解决方案1】:

确实,使用 GET 方法删除您的对象会使您容易受到CSRF attacks 的攻击。

DeleteView 仅在 POST 时删除,并在 GET 时显示确认页面。

您的代码在views.py 中应如下所示:

from django.views.generic import DeleteView

class PostDelete(DeleteView):
    model = Post
    success_url = reverse_lazy('posts.views.all_posts')

urls.py:

url(r'^delete/(?P<pk>\d+)/$', PostDelete.as_view(),
        name='entry_delete'),

您的表单(未使用确认模板。文档中有确认模板示例):

<form action="{% url 'entry_delete' object.pk %}" method="post">
    {% csrf_token %}
    <input type="submit" value="Delete" />
</form>

如果您没有使用确认模板,请确保将表单的 action 属性指向 DeleteView (this is why)。

为确保删除帖子的用户是拥有该帖子的用户,我喜欢使用mixins。假设您的Post 模型有一个指向Usercreated_by 外键,您可以编写如下mixin:

from django.core.exceptions import PermissionDenied

class PermissionMixin(object):

    def get_object(self, *args, **kwargs):
        obj = super(PermissionMixin, self).get_object(*args, **kwargs)
        if not obj.created_by == self.request.user:
            raise PermissionDenied()
        else:
            return obj

最后,你的 DeleteView 应该继承自这个 mixin:

class PostDelete(PermissionMixin, DeleteView):

    model = Post
    success_url = reverse_lazy('posts.views.all_posts')

【讨论】:

  • 太棒了,效果很好 - 我在没有确认屏幕的情况下尝试过,效果非常好。我现在将尝试在确认屏幕中添加。
  • 对于将来看到这个的任何人,您还需要在您的 urls.py 中导入 PostDelete 例如:from views import PostDelete
猜你喜欢
  • 2019-01-05
  • 2020-01-31
  • 2020-02-13
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2018-10-17
相关资源
最近更新 更多