formset、inlineformset_Factory 和 kwargs
Posted
技术标签:
【中文标题】formset、inlineformset_Factory 和 kwargs【英文标题】:formset, inlineformset_Factory and kwargs 【发布时间】:2012-04-29 03:52:31 【问题描述】:我有几个模型,我们称它们为模型 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 不接受自定义夸格斯。它只需要方法 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):
我认为我不能使用 formfield_callback,因为我需要传递 self.request.user 来过滤查询集中返回的对象。
有什么建议吗?
【问题讨论】:
回答here 包括一个使用 request.user 过滤内联表单字段的示例。 @dgel 谢谢!我试试看。 @dgel 正在使用 django 1.3 和基于类的视图。我还能以某种方式访问 self.request 吗?我现在正在尝试,但以防你提前知道。 实际上没有使用过基于类的视图。只要您创建 inlineformset_factory 并将 formfield_callback 传递给 request.user 可见的地方,就可以了。 err.. formfield_callback 不会在 modelForm =\ 中的自定义字段上执行。也许你能告诉我我是不是疯了? django/forms/models.py -> def fields_for_model -> 第 146 行 【参考方案1】:为了将 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。
我可能会在以后找到时间时进行编辑以添加更多详细信息和描述。
【讨论】:
以上是关于formset、inlineformset_Factory 和 kwargs的主要内容,如果未能解决你的问题,请参考以下文章
Django - 基数为 10 的 int() 的 Formset 无效文字:''
Django CBV - Formsets:'NoneType'对象没有属性'id'
Django 和 jQuery.formset,如何操作删除按钮位置