Python 更改非父模型inlineformset中模型字段的queryset

Python 更改非父模型inlineformset中模型字段的queryset,python,django,django-forms,inline-formset,Python,Django,Django Forms,Inline Formset,我使用的是内联表单集,需要在实例化表单集时更改非父模型表单字段之一的queryset class Foo(Model): name = models.TextField() class Bar(Model): foo = models.ForiegnKey(Foo) other_model = models.ForeignKey(OtherModel) class BarForm(ModelForm): class Meta: model=Bar fo

我使用的是内联表单集,需要在实例化表单集时更改非父模型表单字段之一的queryset

class Foo(Model):
   name = models.TextField()

class Bar(Model):
   foo = models.ForiegnKey(Foo)
   other_model = models.ForeignKey(OtherModel)

class BarForm(ModelForm):
   class Meta:
      model=Bar


foo = Foo.object.get(id=1)
FormSet = inlineformset_factory(Foo, Bar, form=BarForm)
formset = FormSet(instance=foo)

根据输入视图代码之前未确定的foo值,我需要为表单集中的所有表单更改条形表单中“other_model”字段的queryset。有办法做到这一点吗

如果我理解正确,这就是你能做的。。。您可以覆盖
BaseInlineFormSet
,然后在表单集中的每个表单上手动设置该字段的查询集

因此,在forms.py中,您可以执行以下操作:

class BaseBarFormSet(BaseInlineFormSet):
    def __init__(self, other_model_queryset, *args, **kwargs):
        super(BaseInlineFormSet, self).__init__(*args, **kwargs)

        for form in self.forms:
            form.fields['other_field'].queryset = other_model_queryset
注意uuu init_uuu的第一个参数是如何设置查询集的

然后在您的视图中,您只需相应地修改当前代码。在factory函数中传入新的BaseBarFormSet:

FormSet = inlineformset_factory(Foo, Bar, form=BarForm, formset=forms.BaseBarFormSet) # notice formset=forms.BaseBarFormSet
然后将另一个字段所需的查询集传递给工厂函数创建的实际
FormSet
类:

formset = FormSet(OtherModel.objects.filter(…), instance=foo) #notice the first parameter

表单集有时非常复杂,所以希望这是有意义的…如果您有问题,请告诉我。

这似乎解决了queryset的问题。然而,我在我的额外表单上得到了验证错误,即使它没有改变。我的印象是Formset不会这样做。在django文档中,“表单集足够聪明,可以忽略未更改的额外表单。”您是对的。如果表单确实为空,则不应出现错误。您的表单上没有任何默认值,是吗?