3

我有几个模型,我们称它们为模型 A 和模型 B。从 B 到 A 有一个外键。
也就是说 A 和 B 之间的基数是 1:n。

我为 B 制作了一个相应的 ModelForm,称为 MF_B。我在 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):

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

有什么建议么?

4

1 回答 1

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:如何限制表单集中的字段选择? 但随后将其适当地调整为 Inlineformset_factory。

稍后我可以找到时间时,我可能会进行编辑以添加更多详细信息和描述。

于 2012-05-15T17:56:42.460 回答