【问题标题】:Django delete&update view only for ownerDjango 删除和更新视图仅适用于所有者
【发布时间】:2018-04-20 11:24:37
【问题描述】:

我正在用 Django 为我的大学编写一些任务。在我的更新和删除视图中,我想确保只有对象的所有者才能更新/删除它。现在每个人都可以做到。

以下是观点:

class UpdateCar(SuccessMessageMixin, UpdateView):
    model = Car
    form_class = AddNewCarForm
    template_name = 'c2crental/car/update_car.html'
    success_url = reverse_lazy('c2crental:list_user_cars')
    success_message = _("Car has been updated.")

    def get_queryset(self):
        owner = self.request.user
        return self.model.objects.filter(owner=owner)


class DeleteCar(DeleteView):
    model = Car
    success_url = reverse_lazy('c2crental:list_user_cars')
    template_name = 'c2crental/car/delete_confirm_car.html'
    success_message = _("Car has been deleted.")

    def delete(self, request, *args, **kwargs):
        messages.success(self.request, self.success_message)
        return super(DeleteCar, self).delete(request, *args, **kwargs)

    def get_queryset(self):
        owner = self.request.user
        return self.model.objects.filter(owner=owner)

我找到了一些带有查询集的解决方案,如上所示。他们不会让其他用户更新/删除对象并引发 Http404 错误,这很好,但我想使用 Django 消息框架在页面上打印错误消息并且不重定向到 Http404 页面。我该怎么做?

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    您可以通过覆盖视图上的 dispatch 或 get_object 方法来做到这一点。

    如您所见,如果 get_object 找不到对象,它会抛出 404,因此如果您与所有者不匹配,您可以抛出 403 或 404。

    def get_object(self, queryset=None):
        """
        Check the logged in user is the owner of the object or 404
        """
        obj = super(MyView, self).get_object(queryset)
        if obj.owner != self.request.user:
            raise Http404(
                _("You don't own this object")
            )
        return obj
    

    【讨论】:

    • 我明白了,但是如何使用 Django 消息打印 Http404 消息作为错误而不是重定向到新页面?
    • 如果某人确实没有获得授权,您不想留在页面上吗?只需在raise 之前添加messages.error(self.request, self.error_message) 即可将消息添加到请求中。
    猜你喜欢
    • 2014-07-05
    • 2021-04-27
    • 1970-01-01
    • 2021-06-23
    • 2012-02-13
    • 2017-01-13
    • 1970-01-01
    • 2012-09-23
    • 2019-07-14
    相关资源
    最近更新 更多