我正在尝试在django中动态导入python模块。我有两个不同的应用程序要从中导入,我想替换这些导入语句:
from app1.forms import App1ProfileForm
from app2.forms import App2ProfileForm
我可以动态地创建字符串App1ProfileForm和App2ProfileForm,然后像这样实例化它们:
globals()[form]()
我尝试按照这篇文章中的一些说明进行操作:Dynamically import class by name for static access
所以我尝试这样做:
theModule = __import__("app1.forms.App1ProfileForm")
但是我收到一条错误,上面写着没有名为App1ProfileForm的模块
EDIT ::: 好的我试过这段代码:
theModule = __import__("app1")
print theModule
theClass = getattr(theModule,'forms')
print theClass
theForm = getattr(theClass,'App1ProfileForm')
print theForm
theForm.initialize()
但是我收到类型对象'App1ProfileForm'没有属性'initialize'的错误
答案 0 :(得分:3)
你不想这样做。在首次执行相关代码时完成导入 - 在模块级导入的情况下,导入模块本身时。如果您依赖于请求中的某些内容或某些其他运行时元素,以确定您想要的类,那么这将无效。
相反,只需导入它们,然后获取代码以选择您需要的代码:
from app1.forms import App1ProfileForm
from app2.forms import App2ProfileForm
forms = {'app1': App1ProfileForm,
'app2': App2ProfileForm}
relevant_form = forms[whatever_the_dependent_value_is]
答案 1 :(得分:1)
我不太清楚你是如何编写要导入的字符串的。我假设你生成了整个“路径”。试试这个:
def import_from_strings(paths): ret = [] for path in paths: module_name, class_name = path.rsplit('.', 1) module = __import__(module_name, globals(), locals(), [class_name], -1) ret.append(getattr(module, class_name)) return ret
答案 2 :(得分:1)
您是不是要尝试导入类,而不是模块?我不是专家,但我认为你必须使用__import__导入模块,然后选择它的App1ProfileForm类,类似于你的模块.App1ProfileForm
答案 3 :(得分:0)
我明白了。这是如何做到的:
theModule = __import__(module_name+".forms") # for some reason need the .forms part
theClass = getattr(theModule,'forms')
theForm = getattr(theClass,form_name)
然后初始化:
theForm() or theForm(request.POST)