Django - Permissions和DeleteView,这是一个很好的方法吗?

时间:2017-03-05 17:09:06

标签: django django-models django-views django-class-based-views

嗨,所以我有一个工作的观点。我想知道这是最好的还是好的方式。我希望有一个删除视图删除Photo对象,但仅当登录用户是与该对象关联的on时。

这是我的views.py

class PhotoDelete(DeleteView):
    model = Photo
    template_name = 'otologue/photo_delete.html'
    success_url = reverse_lazy('otologue:photos')

    def get(self, request, *args, **kwargs):
        object_instance = self.get_object()  # Get the object
        object_user = object_instance.photoextended.user  # Get the user who owns the object

        user = get_object_or_404(User, username=self.request.user)  # Get the user in the view
        if object_user != user:  # See if the object_user is the same as the user
            return HttpResponseForbidden('Permission Error')
        else:
            return render(request, self.template_name, {'object': object_instance})

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

如果您需要更多类似模特的信息,请提出要求。

1 个答案:

答案 0 :(得分:0)

  • 您不必致电get_object_or_404(),因为self.request.user已包含用户实例,因此您可以直接对其进行比较。

  • 您应该调用(并返回结果)DeleteView的get()方法,而不是自己渲染模板。

  • 我还会使用LoginRequiredMixin而不是装饰者,因为除了调用超级方法之外,你的dispatch()现在什么也没做。

  • 请注意,实际删除是在post()方法中完成的。您应该将用户检查移至dispatch()方法,否则可以通过伪造的POST请求绕过检查。

要更好地了解DeleteView在其方法中执行的操作,请检查其源代码(例如,在ccbv.co.uk处)