17

私は Django を初めて使用し、Holovaty と Kaplan-Moss による「The Django Book」に取り組んでいます。「books」と「contact」という 2 つのアプリケーションを含む「mysite」というプロジェクトがあります。それぞれに独自の view.py ファイルがあります。私の urls.py ファイルには次のものがあります。

from books import views
from contact import views
...
urlpatterns = patterns('',
...
(r'^search/$', views.search),
(r'^contact/$', views.contact),
...

コードを実行すると、次のエラーが発生します。

/search/ の NameError ... 例外値: 'module' オブジェクトに属性 'search' がありません

私が信じているのは、連絡先からのビューが最後にインポートされたので、Django は検索を含まない連絡先のビューを見ているということです (検索は本のビューにあります)。

Django URLファイル内の2つの異なるアプリケーションからviews.pyファイルをインポートする適切な方法は何ですか?

ご協力いただきありがとうございます!

4

5 に答える 5

21

免責事項: Djangoの回答ではありません

問題は次の 2 行にあります。

from books import views
from contact import views

2 番目のインポートは最初のインポートをシャドーイングするため、後で使用するときはfromviewsのみを使用します。viewscontact

1つの解決策は、次のことだけです。

import books
import contact

urlpatterns = patterns('',
...
(r'^search/$', books.views.search),
(r'^contact/$', contact.views.contact),
...

よくわかりませんが、実際には何もインポートする必要はなく、パターンで文字列を使用するだけでよいと思います'books.views.search'


もう 1 つの可能性は、 Simon Visserの提案に従うことです。

from books.views import search
from contact.views import contact
于 2012-07-11T18:56:03.093 に答える
11
from books import views
from contact import views

名前を上書きしていますviews。それらを別の名前または絶対名としてインポートする必要があります。

import books.views
import contact.views

... また ...

from books import views as books_views
from contact import views as contact_views

次に、URL を定義するときに正しい名前を使用します。(books.views.searchまたはbooks_views.search選択した方法に応じて)

于 2012-07-11T18:56:49.190 に答える
2

URLconfsのドキュメントには、同じ状況の例が示されています

インポートをスキップして、アプリごとにURLを区切ることができます。

urlpatterns = patterns('books.views',
    (r'^/book/search/$', 'search'), #calls books.views.search
)

urlpatterns += patterns('contact.views', #make note of the '+='
    (r'^/contact/search/$', 'search'), #calls contact.views.search
)
于 2012-07-11T19:28:18.447 に答える