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))'