2011-01-22 78 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]