get_model等效于ModelForms?

时间:2010-07-17 02:03:21

标签: django modelform

我有一个多个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

2 个答案:

答案 0 :(得分:2)

创建ModelForm时,它不会使用其模型的应用注册自己。 (根据经验和快速浏览来源)。

以下是我能想到的一些其他选项:

  1. 所有ModelForm类都存在于一个模块中:根据字符串在该模块上使用getattr

  2. 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()
    
  3. 您正在处理很多表单:为您的ModelForm创建一个基类,或者在运行时替换BaseModelFormMetaclass。您必须自动处理名称冲突,重复ModelForm等相同Model“的问题,以便为一些令人头疼的问题做好准备。如果你可以把它拉下来,那将是非常好的。

  4. 就个人而言(你可能已经看到了),我只选择#2选项。

答案 1 :(得分:-1)

另一种方法是将forms.py替换为名为forms的包。然后,在该包中的__init__.py中,导入所有ModelForm s。

然后你可以使用sdolan的选项#1。