get_model 相当于 ModelForms 吗?

2024-01-05

我有多个 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它不会在其模型的应用程序中注册自己。 (基于经验和快速浏览源代码)。

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

  1. All ModelForm类存在于单个模块中: Use getattr基于字符串的该模块。

  2. 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()
    
  3. 您正在处理很多表格:为您的 ModelForm 创建一个基类,或替换BaseModelFormMetaclass在运行时。您必须处理诸如名称冲突、重复等问题ModelForms 相同Model“自动”,因此请做好一些头痛的准备。如果你能成功的话那就太棒了。

就我个人而言(正如您可能看到的),我只会选择选项#2。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

get_model 相当于 ModelForms 吗? 的相关文章

随机推荐