我已定义以下表格
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,或者我怎样才能达到我的目的?
由于 安德鲁
答案 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)