代码之家  ›  专栏  ›  技术社区  ›  Mike Ryan

获取ModelForms的等效模型?

  •  3
  • Mike Ryan  · 技术社区  · 16 年前

    我有多个ModelForm类,每个类代表不同的模型。我想要一个通用的“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_模型获取模型,然后将其传递给通用视图,它将显示一个表单,但我无法排除模型字段。

    任何提示的TIA

    2 回复  |  直到 11 年前
        1
  •  2
  •   Sam Dolan    16 年前

    当你创建一个 ModelForm 它不注册自己的模型的应用程序。(基于经验和快速浏览源代码)。

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

    1. 所有 模型形式 类存在于单个模块中: 使用 getattr 基于字符串的模块。

    2. 模型形式 S分布在多个模型中,您有合理的(<30)数量的表单: 从要建模表单类的表单字符串创建字典映射。例如:

      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. 你在处理很多表格 :为模型窗体创建基类,或替换 BaseModelFormMetaclass 在运行时。你必须处理诸如姓名冲突、重复等问题。 模型形式 同样的东西 Model “自动”,所以准备一些头痛。如果你能把它拔下来的话,那就太好了。

    就个人而言(正如你可能看到的),我只想选择2。

        2
  •  -1
  •   coredumperror    11 年前

    另一种方法是替换 forms.py 使用名为 forms . 然后,在 __init__.py 在该包中,导入所有 ModelForm S.

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