将自定义表单参数传递给表单集

Posted

技术标签:

【中文标题】将自定义表单参数传递给表单集【英文标题】:Passing Custom Form parameter to formset 【发布时间】:2010-12-09 07:32:37 【问题描述】:

我定义了以下表单

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 参数默认为 False 并且我的输入没有改变。 有谁知道我如何使用 inlineformset_factory 将 readOnly 参数传递给 MyForm 或者我如何实现我想要的?

谢谢 安德鲁

【问题讨论】:

【参考方案1】:

通过django.forms.models 挖掘你可以看到inlineformset_factory 需要一个表单class,而不是一个实例。这就是为什么您的最后一次尝试有效而另一次失败...传递实例无效的原因。

这应该可以满足您的需求:

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)

【讨论】:

这将迫使我始终将 readOnly 设置为 True,这对我编写上面代码的方式不利。我希望 readOnly 值是 True 或 False 并且相应地工作。 `Formset = inlineformset_factory(ModelA, ModelB form=MyForm(readOnly=readONlyValue))'【参考方案2】:

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

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

【讨论】:

以上是关于将自定义表单参数传递给表单集的主要内容,如果未能解决你的问题,请参考以下文章

将自定义参数传递给 Symfony2 中的自定义 ValidationConstraint

如何将额外的参数传递给 django admin 自定义表单?

如何将自定义凭据传递给 Spring Boot ldap

Zoho Creator Deluge InvokeUrl:如何将表单参数传递给第三方表单?

将参数传递给 django 表单

将参数传递给FormView Django中的表单