我正在尝试实现一个DeleteView并防止模型在用户不是所有者的情况下被删除。我确信这是一项非常微不足道的任务,但我无法找到明确的答案。到目前为止我可以看到我的视图,但目前每个人都可以删除该对象。
这是我的代码:
views.py:
@method_decorator(login_required, name='dispatch')
class RestaurantDeleteView(DeleteView):
model = Restaurant
template_name = 'restaurant/delete_form.html'
success_url = '/'
模型.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})
提前致谢!
这可能不是最好的方法,但它说明了这一点。
在您的
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)
来完成此操作。你会对你发现的东西的数量感到惊讶。
您可以使用
UserPassesTestMixin
来实现此目的。
class RestaurantDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Restaurant
template_name = 'restaurant/delete_form.html'
success_url = '/'
def test_func(self):
restaurant = self.get_object()
return restaurant.owner == self.request.user