【发布时间】:2015-04-07 10:06:44
【问题描述】:
这个问题的灵感来自另一个question。在接受的答案中,建议使用以下方法动态加载任何模型:
from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')
表格有什么等价物吗?我想从特定应用动态加载特定表单。
【问题讨论】:
这个问题的灵感来自另一个question。在接受的答案中,建议使用以下方法动态加载任何模型:
from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')
表格有什么等价物吗?我想从特定应用动态加载特定表单。
【问题讨论】:
我知道这是一个老问题,但我想我会添加我的答案,因为这是我在尝试完成这项工作时发现的问题之一。我从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
【讨论】:
Django applications 保留可用型号的列表。这使得拥有get_model 方法成为可能。
应用程序不保留可用表单的列表,因此没有等效的get_forms 方法。
您链接到的question 和包含的 sn-p 是 2009 年编写的。我上面的链接是针对 Django 1.7 的,但对于旧版和新版 Django 的原理是相同的。
【讨论】: