Как разрешить UpdateView только пользователю, который владеет данной моделью - и эта модель уже связана с внешним ключом

Я хочу, чтобы модель Topping была доступна только текущему пользователю, а не другим пользователям, которые могли бы получить доступ к этой странице, скопировав 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

class UpdateTopping(LoginRequiredMixin, UpdateView):
    model = Topping
    form_class = UpdateToppingForm
    template_name = "pizzas/update_topping.html"

Что-то в этом роде (это сработало на основной модели):

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)

Вы можете сделать примерно следующее:

from django.core.exceptions import PermissionDenied

class UpdateTopping(LoginRequiredMixin, UpdateView):
    model = Topping
    form_class = UpdateToppingForm
    template_name = "pizzas/update_topping.html"

    def form_valid(self, form):
        if self.request.user != form.cleaned_data['pizza'].user:
            raise PermissionDenied(f"You are not allowed to edit this topping.")
Вернуться на верх