2017-04-12 10 views
0

私は複数のアプリを持つプロジェクトを持っています。私は別のアプリからいくつかのコードをしたいとき は、だから私は、より具体的には他のアプリからのDjangoインポートコード

from app.pyfile import * 

または

from app.pyfile import specific_function 

を使用します。私は私が使用するいくつかの共通のものを持っている「commonapp」と呼ばれるアプリを持っている すべての他のアプリで。このアプリでは、私は my_response(request,template,context)と呼ばれる関数を含むいくつかの関数を持っているcommon.pyファイルを持っています。これは、 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が何であるかを知っているが、?私は何かがインポートできない場合、または "グローバル名が定義されていない"場合でも、ImportErrorを期待しています。

私はここで何が欠けていますか?

UPDATE:

ここではmy_response(request,template,context)アプリのファイル構造で、場所を示すスクリーンショットです。

enter image description here

+1

何か? my_responseが定義されていないか、または共通からインポートされているため、NameErrorが返されます。あなたはそれについて何を理解していないのですか? –

+0

私が 'commonapp.common import my_response'を実行しようとすると、私はImportErrorを取得します。私は、他のアプリケーションからインポートした他のすべてのものがちゃんと読み込まれているときに、それがどうなるか理解できません。 –

+0

しかし、これらの両方のエラーは 'commonapp.common'に' my_response'という関数が含まれていないことを示しています。どのように明確ではないのですか?おそらくあなたはそのファイルを表示するべきです。 –

答えて

2

あなたは現在のグローバル名前空間にインポートされたパッケージからインポートすることができ

from commonapp.common import * 

すべてを行うとき。明らかにmy_responseは(何らかの理由で)インポートされていません。 ので、my_responseが解決されたので、あなたはそれの時点で、NameErrorを取得すると、実行、すなわちです

# 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は、一般的に例えばfrom package import non_existing_functionルーチンをインポートすることによって提起されており、他のコンテキストで遭遇されていません。

+0

別のファイルから関数をインポートすると、それはグローバルコンテキストにあるとは思われませんか? def myInfo()内でmy_response()をインポートしてもうまくいきます... グローバルではインポートできませんが、ローカル関数でインポートできますか?理解できません。他のアプリからのモデルをどのようにインポートするのですか? –

+1

あなたは循環インポートの問題があるかもしれません。つまり、commonapp.commonは 'myInfo()'を含むファイルを直接または間接的により多くネストされたインポートによってインポートします。また、 'from package import *'のような、start importを実行することは悪い習慣とみなされ、すべてをインポートする必要がある理由を本当に理解していない限り避けるべきです。 –

+0

私はそれについて考えましたが、私は接続を見つけることができません。 myInfo()は別のアプリケーション上にあり、カスタムファイルでもListViewにネストされていません。特定のモデルのデータを取得する機能です。 my_response()は、テンプレートをレンダリングするための私の「パスパルトゥー」関数であると考えられています。これはDjango 1.5と一緒に働いていました。これが私が1.8に移行したときに起こりました。 そして、私は輸入を頻繁にはしません。私はエラーがあったのでここでそれを試した。 –

関連する問題