我有多个 ModelForm 类,每个类代表一个不同的模型。我想要一个通用的“创建”函数,它根据 URL 参数加载指定的模型表单。可以通过以下方式动态加载模型:
model_name = 'TestModel'
m = get_model('AppLabel', model_name)
有谁知道我如何才能为 ModelForms 实现相同的目标,例如:
modelform_name = 'TestModelForm'
f = get_form('AppLabel', modelform_name)
if f.is_valid():
...
我想不出用通用视图来做到这一点的方法 - 它们需要传递 ModelForm,而不仅仅是它的名称。如果我使用 get_model 获取模型,然后将其传递给通用视图,它将显示一个表单,但我无法排除模型字段。
TIA 提供任何提示
当您创建一个ModelForm
它不会在其模型的应用程序中注册自己。 (基于经验和快速浏览源代码)。
以下是我能想到的其他一些选择:
All ModelForm
类存在于单个模块中: Use getattr
基于字符串的该模块。
-
ModelForm
分布在许多模型中,并且您的表单数量合理(创建从您期望的表单字符串到 ModelForm 类的字典映射。例如:
from some_app.forms import FirstModelForm
from another_app.forms import SecondModelForm
from additional_app.forms import FirstModelForm as AdditionalAppFirstModelForm # Will allow for managing conflicting names easily.
form_mapping = {
'FirstModelForm': FirstModelForm,
'SecondModelForm': SecondForm,
'AdditionalAppFirstModelForm': AdditionalAppFirstModelForm,
}
request_form_class = request.POST.get('form_class')
f = form_mapping.get(request_form_class)(request.POST)
if f.is_valid():
f.save()
您正在处理很多表格:为您的 ModelForm 创建一个基类,或替换BaseModelFormMetaclass
在运行时。您必须处理诸如名称冲突、重复等问题ModelForm
s 相同Model
“自动”,因此请做好一些头痛的准备。如果你能成功的话那就太棒了。
就我个人而言(正如您可能看到的),我只会选择选项#2。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)