将自定义窗体参数传递给formset

时间:2009-10-23 01:04:33

标签: django forms formset

我已定义以下表格

class MyForm(ModelForm):  
    def __init__(self, readOnly=False, *args, **kwargs):  
      super(MyForm,self).__init__(*args,**kwrds)  
      if readOnly:  
        Do stuff to make the inputs readonly

当我在视图中将其作为表单实例化时,MyForm工作正常 form = MyForm(readOnly=True, instance=ModelA)

但是当我尝试在inlineformset_factory中使用它时 Formset = inlineformset_factory(ModelA, ModelB form=MyForm(readOnly=True))
我收到错误“NoneType对象不可调用”。

我认为这是因为表单正在初始化而没有模型实例
因为MyForm正在内联中初始化

我知道问题是我在内联呼叫中使用MyForm的方式 因为如果我执行以下任一操作,我会得到同样的错误

Formset = inlineformset_factory(ModelA, ModelB form=MyForm(readOnly=True))
Formset = inlineformset_factory(ModelA, ModelB form=MyForm())

但如果我这样做,它就有效 Formset = inlineformset_factory(ModelA, ModelB form=MyForm)

显然,readOnly param默认为False,我的输入不会改变。 有谁知道如何使用inlineformset_factory将readOnly参数传递给MyForm,或者我怎样才能达到我的目的?

由于 安德鲁

2 个答案:

答案 0 :(得分:4)

通过django.forms.models挖掘,您可以看到inlineformset_factory需要表单,而不是实例。这就是为什么你的最后一次尝试有效而另一次失败...传递实例将无效。

这应该可以满足您的需求:

class MyReadOnlyForm(MyForm):

    def __init__(self, *args, **kwargs):
        super(MyReadOnlyForm,self).__init__(readOnly=True, *args,**kwargs)


Formset = inlineformset_factory(ModelA, ModelB form=MyReadOnlyForm)

如果您需要两个版本

if read_only is True:
    form_class = MyReadOnlyForm
else:
    form_class = MyForm 

Formset = inlineformset_factory(ModelA, ModelB form=form_class)

答案 1 :(得分:1)

感谢。我确实在另一篇文章中找到了以下内容,并想知道一个人是否比另一个更好。

Formset = inlineformset_factory(ModelA, ModelB form=MyForm)
Formset.form = staticmethod(curry(MyForm, reaOnly=readOnlyvalue))
myFormset = Formset(request.Files, instance=modelAInst)