2011-02-23 65 views
0

當我嘗試導入內部應用程序的東西:Django的進口問題

from app_name.models import something 

我已經導入錯誤, 我必須這樣做:

from models import something 

發生此問題,在許多應用程序只在一個項目。我應該改變什麼?

+1

我想你的應用程序不在sys.path中,或者'__init __。py'在某處丟失。 – Ski 2011-02-23 10:45:25

回答

1

這是不是什麼@Skirmantas建議,即app_name不上PYTHONPATH,或者你有一個包衝突,其中一些其他app_name是您app_namePYTHONPATH前面。

我的預感是它可能是後者,你有一個應用程序與你使用的其他第三方應用程序具有相同的包名稱;我在我的PYTHONPATH上曾經有兩個頂級registration包。

如果你把我的失敗與registration應用爲例,你通常會打包項目是這樣的:

myproject/ 
    myproject/ 
     registration/ 
      __init__.py 
      models.py 
     __init__.py 
     settings.py 
     urls.py 
    setup.py 

這是所有應用都應該打包一個community guideline是「插頭和玩「兼容。他們應該是一個頂級的軟件包,應該能夠通過@Yuji建議的絕對路徑來引用內部資源。如果您喜歡將您的應用程序與您的項目一起發貨和打包,那意味着除了/myproject之外,/myproject/myproject也可以在PYTHONPATH之上。這甚至是enforced in some cases

正如我所說,這只是一個預感,你有衝突包名稱。如果是這樣的話,那麼在這篇冗長的文章之後,你應該明白,你唯一的選擇是將你的軟件包重新命名爲更獨特的東西,但我絕不會立即將它直接泄露給某人。這是由於可悲的事實,我從來沒有找到一個更合適的名稱來代替registration

+0

問題已解決。我在我的應用程序文件中使用了與應用程序相同的名稱。所以python試圖從這個文件中導入表格,但不是從應用程序導入。 – szaman 2011-03-02 10:43:40

0

對不起,但你爲什麼要改變它? 這種方式更加乾燥 - 你不會一遍又一遍重複app_name - 如果你想在將來重命名它 - 會更容易。

編輯:我的問題是回答下面,我顯然不知道你應該總是導入使用完整路徑的事實。

至於直接回答,我有2個猜測(沒有足夠的信息來完整地回答):

  1. 也許應用程序不把自己看作一個模塊,當你從內
  2. 你導入缺少一些其他導入,一般到您的應用程序。

對不起,我不能更精確。

+0

http://www.python.org/dev/peps/pep-0008/對於包內導入的相對導入非常不鼓勵。 始終對所有導入使用絕對包路徑。 即使現在PEP 328 [7]已經在Python 2中完全實現了。5, 其明顯的相對進口風格被積極勸阻; 絕對導入更便攜,通常更具可讀性。 – 2011-02-23 13:29:28