formset,inlineformset_Factory和kwargs

时间:2012-04-17 19:05:42

标签: python django django-forms inline-formset

我有几个型号可以称它们为A型和B型。从B中有A的外键。
这就是A和B之间的基数是1:n。

我为B做了一个名为MF_B的相应ModelForm。我在B中定义了一个额外的字段,例如

class MF_B(forms.ModelForm):

    stuff = forms.MultipleChoiceField(queryset=None, required=False)

    class Meta:
        model=B

如上面的代码所示,我想用查询集填充这里的选项。 (我在 init ()中省略了我们用来在stuff字段上设置查询集的覆盖代码)

这笔交易是我想使用inlineformset_factory在一个页面上创建一个带有A的表单和带有B的几个表单。

我想将一堆新的kwargs传递给inlineformset_factory,但它一直抱怨意外的关键字参数,在查看django中的后端代码之后,我理解为什么:inlineformset_factory不接受自定义kwargs。它只需要在方法sig中定义kwargs。

def inlineformset_factory(parent_model, model, form=ModelForm,
                          formset=BaseInlineFormSet, fk_name=None,
                          fields=None, exclude=None,
                          extra=3, can_order=False, can_delete=True, max_num=None,
                          formfield_callback=None):

我不认为ican使用 formfield_callback ,因为我需要传递self.request.user来过滤返回查询集中的对象。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

为了将MultipleChoiceField限制为您指定的查询集,您必须使用工厂。在这种情况下,它将是一个inlineformset_factory_factory,这有点令人困惑,但例如:

在forms.py(或类似)中

def make_inlineformset_factory(queryset, xmodel):
    """
    Returns an Inlineformset factory for the given queryset . . .
    """
    class My_inlineformset_factory():
        stuff = forms.ModelChoiceField(queryset=queryset)
        class Meta:
            model = xmodel
    return My_inlineformset_factory

具体来说,我正在考虑类似于第一个答案的方法:django: How to limit field choices in formset? 但然后适当地适应Inlineformset_factory。

我可以编辑以便在以后找到时间时添加更多详细信息和说明。