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)