通过html链接删除Django中的对象

 bearden孔 发布于 2022-12-18 17:48

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

关于堆栈溢出有一些问题,但我似乎无法找到一个完整的,可行的答案(我正在使用Django 1.7),当我实现它时不会抛出错误.

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

到目前为止,在我的views.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\d+)/$','posts.views.delete'),

在html中:

Delete

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

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

1 个回答
  • 实际上,使用GET方法删除对象会使您容易受到CSRF攻击.

    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(这就是原因).

    为了确保用户删除帖子是拥有它的用户,我喜欢使用mixins.假设你的Post模型有一个created_by外键指向User,你可以写一个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')
    

    2022-12-18 17:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有