Django - 动态导入

时间:2011-01-22 17:35:06

标签: python django

我正在尝试在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'的错误

4 个答案:

答案 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)