如何让UpdateView仅允许Topping关联的Pizza所有者访问?
实现Topping更新页面的权限控制:仅允许关联Pizza的所有者访问
需求:让Topping模型的更新页面仅对该Topping关联的Pizza的所有者开放,禁止其他用户通过复制URL访问。
现有代码
models.py
class Pizza(models.Model): name = models.CharField(max_length=20) owner = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return self.name def get_absolute_url(self): return "/pizzas" class Topping(models.Model): pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE) name = models.CharField(max_length=20) def __str__(self): return self.name def get_absolute_url(self): return reverse("pizza", kwargs={"pizza_id": self.pizza.pk})
views.py(原UpdateTopping视图)
class UpdateTopping(LoginRequiredMixin, UpdateView): model = Topping form_class = UpdateToppingForm template_name = "pizzas/update_topping.html"
参考已实现的Pizza权限控制逻辑
已生效的Pizza更新权限控制代码:
class UpdatePizza(LoginRequiredMixin, UpdateView): model = Pizza form_class = UpdatePizzaForm template_name = "pizzas/update_pizza.html" def get_queryset(self): base_qs = super(UpdatePizza, self).get_queryset() return base_qs.filter(owner=self.request.user)
修改Topping的更新视图实现权限控制
只需给UpdateTopping类添加get_queryset方法,通过关联的Pizza过滤出当前用户拥有的Topping:
class UpdateTopping(LoginRequiredMixin, UpdateView): model = Topping form_class = UpdateToppingForm template_name = "pizzas/update_topping.html" def get_queryset(self): base_qs = super().get_queryset() # 过滤出当前用户是关联Pizza所有者的Topping return base_qs.filter(pizza__owner=self.request.user)
逻辑说明
- 继承
LoginRequiredMixin保证用户必须登录才能访问 - 重写
get_queryset方法,通过pizza__owner跨关联模型过滤:只返回当前用户作为所有者的Pizza下的Topping - 如果其他用户访问不属于自己的Topping更新URL,Django会返回404页面,无法进行修改操作
内容的提问来源于stack exchange,提问作者Duka93
相关产品推荐
相关产品推荐

