通过自定义表单参数FORMSET(Passing Custom Form parameter to

2019-08-31 14:22发布

我有如下形式定义

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)

显然只读PARAM默认为False,我的投入不会改变。 有谁知道我可以通过只读PARAM使用inlineformset_factory不然我还能怎么达到我想要什么MyForm的?

由于安德鲁

Answer 1:

通过挖掘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)


Answer 2:

谢谢。 我发现在另一篇文章下面,想知道是否一个比另一个更好。

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



文章来源: Passing Custom Form parameter to formset