Django - 从单独的应用程序导入视图

Ray*_*Ray 12 python django

我是Django的新手,并通过Holovaty和Kaplan-Moss的"The Django Book"工作.我有一个名为"mysite"的项目,其中包含两个名为"books"和"contact"的应用程序.每个都有自己的view.py文件.在我的urls.py文件中,我有以下内容:

from books import views
from contact import views
...
urlpatterns = patterns('',
...
(r'^search/$', views.search),
(r'^contact/$', views.contact),
...
Run Code Online (Sandbox Code Playgroud)

当我运行我的代码时,我收到此错误:

NameError在/ search/...异常值:'module'对象没有属性'search'

我认为正在发生的事情是,由于联系人的观点是最后导入的,因此Django正在查看不包含搜索的联系人视图(搜索在书籍视图中).

从Django urls文件中的两个不同应用程序导入views.py文件的正确方法是什么?

谢谢你的帮助!

Rik*_*ggi 19

免责声明:不是Django的答案

问题在于这两行:

from books import views
from contact import views
Run Code Online (Sandbox Code Playgroud)

第二个导入是遮蔽第一个,所以当你views以后使用时,你只使用了viewsfrom contact.

一种解决方案可能只是:

import books
import contact

urlpatterns = patterns('',
...
(r'^search/$', books.views.search),
(r'^contact/$', contact.views.contact),
...
Run Code Online (Sandbox Code Playgroud)

我不确定,但我也认为你实际上并不需要导入任何东西,只能在你的模式中使用字符串,例如:'books.views.search'.


另一种可能性是遵循Simon Visser的建议:

from books.views import search
from contact.views import contact
Run Code Online (Sandbox Code Playgroud)


Fog*_*ird 8

from books import views
from contact import views
Run Code Online (Sandbox Code Playgroud)

你正在覆盖这个名字views.您需要将它们作为不同的名称或绝对名称导入.

import books.views
import contact.views
Run Code Online (Sandbox Code Playgroud)

... 要么 ...

from books import views as books_views
from contact import views as contact_views
Run Code Online (Sandbox Code Playgroud)

然后在定义URL时使用正确的名称.(books.views.searchbooks_views.search根据您选择的方法)