【问题标题】:How do I retrieve a Django form class dynamically?如何动态检索 Django 表单类?
【发布时间】:2015-04-07 10:06:44
【问题描述】:

这个问题的灵感来自另一个question。在接受的答案中,建议使用以下方法动态加载任何模型:

from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')

表格有什么等价物吗?我想从特定应用动态加载特定表单

【问题讨论】:

    标签: django forms


    【解决方案1】:

    我知道这是一个老问题,但我想我会添加我的答案,因为这是我在尝试完成这项工作时发现的问题之一。我从this question 借来的,并且能够使用getattr 动态加载表单:

    from my_app import forms
    
    custom_form = getattr(forms, 'CustomForm')()
    

    此解决方案要求您已加载模块。

    我尚未对其进行测试,但您应该能够使用来自importlib (https://docs.python.org/3/library/importlib.html#importlib.import_module) 的import_module 函数将上述内容与动态模块导入结合起来。实现看起来像:

    from importlib import import_module
    
    forms = import_module('my_app', 'forms')
    custom_form = getattr(forms, 'CustomForm')()
    

    Django Oscar 经常使用这种动态类加载,所以你可以看看他们的代码,看看他们是如何将这些放在一起的:https://github.com/django-oscar/django-oscar/blob/master/src/oscar/core/loading.py

    【讨论】:

      【解决方案2】:

      Django applications 保留可用型号的列表。这使得拥有get_model 方法成为可能。

      应用程序不保留可用表单的列表,因此没有等效的get_forms 方法。

      您链接到的question 和包含的 sn-p 是 2009 年编写的。我上面的链接是针对 Django 1.7 的,但对于旧版和新版 Django 的原理是相同的。

      【讨论】:

        猜你喜欢
        • 2010-09-29
        • 1970-01-01
        • 2020-07-07
        • 2016-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 1970-01-01
        相关资源
        最近更新 更多