我正在使用内联表单集,需要在实例化表单集时更改非父模型的某个表单字段的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值,我需要为表单集中的所有表单更改BarForm中“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

请注意,init的第一个参数是如何设置的queryset。
然后在您的视图中,您只需相应地修改当前代码。在工厂函数中传入新的BaseBarFormSet:
FormSet = inlineformset_factory(Foo, Bar, form=BarForm, formset=forms.BaseBarFormSet) # notice formset=forms.BaseBarFormSet

然后将另一个字段的queryset传递给工厂函数创建的实际FormSet类:
formset = FormSet(OtherModel.objects.filter(…), instance=foo) #notice the first parameter

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

关于python - 在非父模型的inlineformset中更改模型字段的查询集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19305964/

10-09 20:16