2017-04-12 50 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时发生了这种情况。 而且我不经常进行导入*。我在这里尝试过,因为我有错误。 –

相关问题