通过html链接删除Django中的对象
我有一个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<id>d+)/$','posts.views.delete'), 在html中: <a href="/delete/{{ post.id }}">Delete</a> 这一切都有效,但没有安全性 – 所以请欣赏有关如何添加表单和检查的指导. 另外,我已经看到了一个使用DeleteView的答案,但是也无法使用它. 解决方法
实际上,使用GET方法删除对象会使您容易受到
CSRF attacks的攻击.
您的代码应该在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模型有一个指向User的created_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') (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |