Django - выборка только связанного внешнего ключа в UpdateView и View

Посмотрите, пожалуйста, на эту установку ниже.

В форме продукта отображается поле названия и выпадающий список категорий. Однако в выпадающем списке отображаются все категории от всех пользователей, но мне нужно показать только собственные категории пользователя, например filter(user=request.user), но я не знаю, где разместить эту проверку (в форме или модели или в представлении) и как.

# models.py
class Product(models.Model):
    name = models.CharField(max_length=200, null=False)
    category = models.ForeignKey(ProductCategory, on_delete=models.CASCADE, null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)


class Category(models.Model):
    name = models.CharField(max_length=200, null=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE)


# forms.py
class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'category']


# views.py

class ProductsView(View):
    model = Product
    form_class = ProductForm
    initial = {}
    template_name = "products_list.html"

    def get(self, request, *args, **kwargs):
        category_id = kwargs['category_id']

        #### I need to do this check in 4 other models, could you recommend a beter way?
        try:
            # Check if user is allowed to view this category
    
            category_obj = Category.objects.filter(
                user=self.request.user).get(pk=category_id)
        except Category.DoesNotExist:
            return redirect('homepage')

        # To add a new product form 
        form = self.form_class(initial=self.initial)
        
        # There's another form on this page to add a category 
        form_category = ProductCategoryForm

        return render(request, self.template_name, {'form': form, 'form_category': form_category, 'category': category_obj})




class ProductEditView(UpdateView):
    model = Product
    form_class = ProductForm
    template_name = "product_edit.html"
Вернуться на верх