【问题标题】:Django - how to restrict DeleteView to object ownerDjango - 如何将 DeleteView 限制为对象所有者
【发布时间】:2019-02-15 23:14:57
【问题描述】:

我正在尝试实现 DeleteView 并防止在用户不是所有者的情况下删除模型。我确信这是一项非常微不足道的任务,但我无法找到明确的答案。到目前为止,我可以看到我的视图,但目前每个人都可以删除该对象。

这是我的代码:

views.py:

@method_decorator(login_required, name='dispatch')
class RestaurantDeleteView(DeleteView):
    model = Restaurant
    template_name = 'restaurant/delete_form.html'
    success_url = '/'

models.py:

class Restaurant(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    category = models.CharField(max_length=200)
    description = models.TextField()
    capacity = models.IntegerField(default=0)

def get_absolute_url(self):
    return reverse('detail', kwargs={'pk': self.pk})

提前致谢!

【问题讨论】:

标签: python django view


【解决方案1】:

这可能不是最好的方法,但它说明了这一点。

在您的views.py 中,您可以访问self.get_object() 以获取引用中的模型实例,然后检查是否instance.owner == self.request.user。查看源代码并尽可能忠实于原始代码。您所需要的只是条件检查。

类似这样的:

@method_decorator(login_required, name='dispatch')
class FooDeleteView(DeleteView):
    model = Foo
    success_url = reverse_lazy('index')

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        if self.object.owner != self.request.user:
            return redirect(self.success_url)
        return super().post(request, *args, **kwargs)

如果你好奇想了解更多,可以import pdb,将pdb.set_trace()放在方法的第一行,探索self是什么,有哪些方法可用。一旦你进入方法调用,你可以通过调用dir(self) 来做到这一点。你会惊讶于你发现的东西的数量。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2017-11-21
    • 2018-06-25
    • 1970-01-01
    • 2016-09-19
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多