2017-04-12 23 views
0

我有一個項目whith多個應用程序。 所以,當我想從另一個應用中的一些代碼,我用Django從其他應用程序進口代碼

from app.pyfile import * 

from app.pyfile import specific_function 

更具體: 我有一個名爲「commonapp」在那裏我有我使用一些常見的東西的應用在所有其他應用程序中。在這個應用程序中,我有一個common.py文件,我有一些功能,其中包括一個名爲my_response(request,template,context)的函數,這個函數導致NameError。現在這個特定的函數總是被其他函數調用。

例如:

from commonapp.common import * 

def myInfo(request): 
    context = {} 
    data = '' 
    data = SomeModel.objects.all() 
    template = 'path/to/info.html' 
    context['data'] = data 
    a = my_response(request,template,context) 
    return a 

這就提出了一個NameError 「全局名稱my_response沒有定義」

我知道NameError是什麼,但爲什麼在這裏?如果某些東西無法導入,甚至「全局名稱a未定義」,我會期待導入錯誤。

我在這裏錯過了什麼?

UPDATE:

這裏是表示將my_response(request,template,context)是與該應用程序的文件結構的屏幕截圖。

enter image description here

+1

呃,什麼?你會得到一個NameError,因爲my_response沒有在那裏定義或從常規導入。你對此不甚瞭解? –

+0

當我嘗試'從commonapp.common導入my_response'時,我得到一個ImportError。我無法理解,當我從其他應用程序導入的其他所有內容都被導入時,這是如何實現的。 –

+0

但這兩個錯誤都顯示'commonapp.common'不包含名爲'my_response'的函數。這怎麼不清楚?也許你應該顯示那個文件。 –

回答

2

當你

from commonapp.common import * 

一切,可以從包裝進口被導入到當前的全局命名空間。顯然my_response沒有導入(出於某種原因)。 所以,你NameError,因爲my_response是在這點解決的執行,即在

# Python tries to lookup `my_response` in local and then global context 
# But, it can't find it, thus NameError exception occurs. 
a = my_response(request,template,context) 

而且ImportError s的通常通過導入程序提出e.g from package import non_existing_function而在其他情況下都沒有遇到過。

+0

好的,當你從另一個文件中導入一個函數時,是不是假設在全局範圍內? 如果我在def myInfo()中導入my_response(),它工作得很好...... 所以它不能在全局導入,但可以在本地函數中導入?我不明白。我的意思是如何導入其他應用程序的模型? –

+1

這可能是因爲你有循環導入問題,即commonapp.common通過更多嵌套導入直接或間接導入包含'myInfo()'的文件。還要注意,開始導入,像'從包導入*'一樣被認爲是不好的做法,應該避免,除非你真正理解爲什麼你需要導入所有東西。 –

+0

我已經想過,但我似乎無法找到連接。 myInfo()在另一個應用程序中,也在自定義文件中,例如,不嵌套在ListView中。它只是一個從特定模型獲取某些數據的函數。 my_response()應該是我用於渲染模板的「passepartout」函數。它與Django 1.5合作。當我遷移到1.8時發生了這種情況。 而且我不經常進行導入*。我在這裏嘗試過,因爲我有錯誤。 –

相關問題