2011-01-22 79 views
0

我想在django中做一个python模块的动态导入。我有我想从导入两个不同的应用程序,我想替换这些导入语句:Django - 动态导入

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

编辑::: 好,我想这代码模块的错误:

theModule = __import__("app1") 
    print theModule 
    theClass = getattr(theModule,'forms') 
    print theClass 
    theForm = getattr(theClass,'App1ProfileForm') 
    print theForm 
    theForm.initialize() 

,但我得到一个错误的对象类型“App1ProfileForm”没有属性“初始化”

+0

`theForm`是一类。我想你想实例化它,而不是使用它。尝试类似`theForm()。initialize()`。 – pkoch 2011-02-09 01:57:05

回答

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) 
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 
+0

哪里定义了`paths`? – kelloti 2011-01-22 18:17:57

+0

这是函数的论点。没有? 我已经与import_from_strings([“readline.get_history_length”,“readline.get_line_buffer”])测试 – pkoch 2011-01-22 18:27:30

+0

刚编辑我的职务 – JPC 2011-01-22 19:03:02

1

难道你不是要导入一个类,而不是一个模块?我不是专家,但我认为您必须使用__import__导入模块,然后选择它的App1ProfileForm类,如yourmodule.App1ProfileForm

+0

这是接近的,我已经编辑我的职务,以显示我的新尝试 – JPC 2011-01-22 18:58:20

3

您不想这样做。导入是在相关代码首次执行时完成的 - 在模块级导入的情况下,导入模块本身的时候。如果您依赖于请求中的某些内容或其他运行时元素来确定您想要的类,那么这将不起作用。

相反,只需要导入他们两个,并让代码选择你需要的一个:

from app1.forms import App1ProfileForm 
from app2.forms import App2ProfileForm 

forms = {'app1': App1ProfileForm, 
     'app2': App2ProfileForm} 
relevant_form = forms[whatever_the_dependent_value_is]