You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:25:27