Python 如何更改django inlineformset_工厂生成的表单集的外键列表?

Python 如何更改django inlineformset_工厂生成的表单集的外键列表?,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我有以下型号: class Organization(models.Model): name = models.CharField(max_length=255) owner = models.OneToOneField(User, on_delete=models.CASCADE) def __str__(self): return f"{self.name}" class Category(models.Model): name = mo

我有以下型号:

class Organization(models.Model):
    name = models.CharField(max_length=255)
    owner = models.OneToOneField(User, on_delete=models.CASCADE)

def __str__(self):
    return f"{self.name}"

class Category(models.Model):
   name = models.CharField(max_length=255)
   organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name='categories')

   class Meta:
       verbose_name = "category"
       verbose_name_plural = "categories"
       order_with_respect_to = 'organization'

def __str__(self):
    return self.name

class Product(models.Model):
    brand = models.CharField(max_length=255, blank=True, null=True)
    name = models.CharField(max_length=255)
    code = models.CharField(max_length=255)
    sale_price = models.DecimalField(decimal_places=2, max_digits=12)
    stock = models.DecimalField(decimal_places=2, max_digits=12)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name='products')
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='producs', null=True, blank=True)

    class Meta:
        order_with_respect_to = 'organization'
我想要一个内联表单集,用户可以在其中添加产品,但我只想显示注册到当前用户组织的类别(可通过
request.user.organization
访问)

现在,表单集是如何设置的:

def addProducts(request):
   ProductFormSet = inlineformset_factory(Organization, Product, exclude=('organization',), extra=5)
   organization = request.user.organization
   if request.method == "POST":
      formset = ProductFormSet(request.POST, 
        instance=organization, queryset=Product.objects.none())

   else:
      formset = ProductFormSet(
        instance=organization, queryset=Product.objects.none())


   context = {"forms": formset}

   return render(request, "products/product_form.html", context=context)
但是,正如您可能猜到的,选择字段显示的是所有类别,而不仅仅是具有相同组织的类别。 如何将
Category.objects.filter(organization=organization)
传递到select字段?

以下是我修复该字段的方法:

将ProductForm包装到函数中:

def productform_factory(organization):

class ProductForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["category"].queryset = Category.objects.filter(
            organization=organization)

    class Meta:
        model = Product
        fields = ['brand', 'name', 'code', 'sale_price', 'stock', 'category']


return ProductForm
将视图代码更改为:

organization = request.user.organization
ProductFormSet = inlineformset_factory(Organization, Product, form=productform_factory(organization), extra=4)

if request.method == "POST":
    formset = ProductFormSet(request.POST,
        queryset=Product.objects.none())
else:
    formset = ProductFormSet(
        queryset=Product.objects.none())

context = {
    # 'form': form,
    'title': 'Add Product',
    'formset': formset
}
return render(request, "products/product_form.html", context=context)