更改非父模型的inlineformset中模型字段的查询集

时间:2013-10-10 20:50:07

标签: python django django-forms inline-formset

我正在使用内联formset,并且需要在实例化formset时更改其中一个非父模型的表单字段的查询集。

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的值,我需要在formForm中为formForm中的所有表单更改'other_model'字段的查询集。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:6)

如果我理解正确,您可以执行此操作...您可以覆盖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

注意__init__的第一个参数是你想要设置的查询集。

然后在您看来,您只需相应地修改当前代码。在工厂函数中传入新的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

有时,Formsets非常复杂,所以希望这有意义......如果你有问题,请告诉我。