Django 将自定义表单参数传递给formset

Django 将自定义表单参数传递给formset,django,forms,formset,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=My

我定义了以下表单

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\u工厂中使用它时
Formset=inlineformset\u工厂(ModelA,modelbform=MyForm(readOnly=True))

我得到错误“非类型对象不可调用”

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

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

Formset=inlineformset\u工厂(ModelA,modelbform=MyForm(readOnly=True))

Formset=inlineformset\u工厂(ModelA,modelbform=MyForm())

但如果我这样做,它会起作用
Formset=inlineformset\u工厂(ModelA,modelbform=MyForm)

显然,readOnly参数默认为False,并且我的输入没有改变。 有人知道我如何使用inlineformset_工厂将readOnly参数传递给MyForm吗?或者我如何实现我想要的

谢谢
Andrew

深入查看
django.forms.models
您可以看到
inlineformset\u工厂
需要一个表单类,而不是实例。这就是为什么您的最后一次尝试有效,而另一次失败的原因…传入一个实例将不起作用

这将为您提供您想要的:

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)

谢谢。我确实在另一篇文章中发现了以下内容,我想知道其中一篇是否比另一篇好

Formset=inlineformset\u工厂(ModelA,modelbform=MyForm)

Formset.form=staticmethod(curry(MyForm,reaOnly=readOnlyvalue))


myFormset=Formset(request.Files,instance=modelAInst)

这将迫使我始终将readOnly设置为True,我的错误在于我编写上述代码的方式。我希望readOnly值为True或False,并且th form可以相应地工作`Formset=inlineformset_工厂(ModelA,modelbform=MyForm(readOnly=readONlyValue))'