我有一个多个ModelForm类,每个类代表一个不同的Model。我想有一个通用的'create'函数,它根据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
答案 0 :(得分:2)
创建ModelForm
时,它不会使用其模型的应用注册自己。 (根据经验和快速浏览来源)。
以下是我能想到的一些其他选项:
所有ModelForm
类都存在于一个模块中:根据字符串在该模块上使用getattr
。
ModelForm
分布在众多模型中,您有合理的(<30)表单数量:
从您期望的表单字符串创建字典映射到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
等相同Model
“的问题,以便为一些令人头疼的问题做好准备。如果你可以把它拉下来,那将是非常好的。
就个人而言(你可能已经看到了),我只选择#2选项。
答案 1 :(得分:-1)
另一种方法是将forms.py
替换为名为forms
的包。然后,在该包中的__init__.py
中,导入所有ModelForm
s。
然后你可以使用sdolan的选项#1。