4

我定义了以下表格

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 实例化为表单时,MyForm 可以完美运行
form = MyForm(readOnly=True, instance=ModelA)

但是当我尝试在 inlineformset_factory 中使用它时,
Formset = inlineformset_factory(ModelA, ModelB form=MyForm(readOnly=True))
我收到错误“NoneType object is not callable”。

我认为这是因为在没有模型实例的情况下初始化表单,
因为 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 参数默认为 False 并且我的输入没有改变。有谁知道我如何使用 inlineformset_factory 将 readOnly 参数传递给 MyForm 或者我如何实现我想要的?

谢谢安德鲁

4

2 回答 2

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)
于 2009-10-23T05:25:59.177 回答
1

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

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

于 2009-10-26T21:27:51.530 回答