2012-07-11 82 views
6

我是新來的Django並通過「Django的書」 Holovaty和Kaplan-MOSS工作我的方式導入的看法。我有一個名爲「mysite的」項目包含兩個應用程序稱爲「書」和「接觸」。每個都有自己的view.py文件。在我的urls.py文件,我有以下幾點:Django的 - 從單獨的應用程序

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

當我運行我的代碼,我得到這個錯誤:在/搜索/ ... 異常值

NameError:「模塊」對象有沒有屬性「搜索」

我認爲正在發生的事情是,因爲從接觸的意見,上次導入,Django是看不包含搜索(搜索,書籍視圖)接觸的觀點。

什麼是進口來自兩個不同的應用程序的views.py文件Django的URL中的文件的正確方法?

感謝您的幫助!

回答

15

免責聲明:沒有一個Django回答

問題是與這兩條線:

from books import views 
from contact import views 

第二進口被遮蔽的第一個,所以當你使用views以後你只利用contactviews

一種解決方案可能是隻:

import books 
import contact 

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

我不知道,但我也認爲你實際上並不需要輸入任何東西,可以只使用字符串的模式,是這樣的: 'books.views.search'


另一種可能是按照Simon Visser建議:

from books.views import search 
from contact.views import contact 
+0

這沒有奏效,但謝謝你的建議。 – William 2012-07-11 19:09:33

+1

@羅伯特:有幾個拼寫錯誤(我固定),除了這是一個工作解決方案。您不必將我們的答案複製並粘貼到代碼中,最好了解它們並找到解決問題的方法。你也可以自由地[接受](http://meta.stackexchange.com/a/5235/177799)幫助你的答案。 – 2012-07-11 19:22:13

+0

Rik,你通過Simon Visser的第二個建議,確實也有效。謝謝。 – William 2012-07-11 20:22:53

4
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.searchbooks_views.search

+0

這個_did_工作。非常感謝! – William 2012-07-11 19:09:53

+1

雖然''from books.views import search''和'from contact.views import contact'更常見。畢竟,你想要導入視圖功能,而不是視圖模塊。 – 2012-07-11 19:14:21

+0

@RobertF。如果它適合你,請確保通過點擊複選標記來接受答案。 – 2012-07-11 19:22:45

2

URLconfs documentation

可以跳過進口,並通過應用這樣分開的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 
) 
+0

非常有趣。謝謝你指出。 – William 2012-07-11 20:12:22

+0

感謝你,4年後:3 – Lucas 2016-07-06 13:11:49

+0

只需指出django.conf.urls.patterns()在Django 1.10中被刪除。 https://docs.djangoproject.com/en/1.10/releases/1.10/#features-removed-in-1-10 – azalea 2016-12-01 16:28:44

1

的原因,我回答這個問題,是因爲它是幾年前回答這些問題的答案是不正確的或有用了較新的Django版本,或者有一個更好的做法,你應該知道。

因此,如果您的Django項目中有多個應用程序,那麼您應該爲每個應用程序使用一個新的urls.py文件。這意味着如果您啓動一個新的應用程序,那麼您必須在新應用程序的子文件夾中手動創建一個名爲urls.py的新文件。許多初學者首先不明白爲什麼這很好,但如果您計劃在一個Django項目中創建更多應用程序,這是一個很好的做法。

當你開始一個項目時,urls.py文件會自動在你的項目文件夾中創建,但是如果你在Django中創建/啓動一個新的應用程序,那麼這是一個很好的做法,如果你爲此創建了一個單獨的urls.py應用程序在自己的文件夾。 (這樣你就永遠不會有「首先將不同應用的視圖導入到urls.py」問題)。

您創建了您的應用程序的urls.py文件後,那麼你必須包括,在項目的urls.py文件的應用程序的urls.py文件以下列方式:

我們先來看看一個例子你創建一個名爲'my_new_app'的新應用程序。 這是項目的主urls.py文件應該如何看起來像:

from django.conf.urls import url, include 
from django.contrib import admin 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^my_new_app/', include('my_new_app.urls')), 
] 

在項目的urls.py文件,你必須導入「包括」方法,那麼你可以包括你的my_new_app urls.py文件您的項目的主要urls.py文件。在您的my_new_app文件夾中,您必須手動創建一個urls.py文件,如上所述。然後你必須使用該文件來處理my_new_app的所有urlpatterns。那麼當然這樣它會被自動包含在你的項目的主要urls.py文件中。

所以這就是那麼你my_new_app自己urls.py文件應該如何看起來像:

from django.conf.urls import url 
from my_new_app import views 

urlpatterns = [ 
    url(r'^$', views.index, name = "index"), 
] 

假設你也是你的「my_new_app/views.py文件創建一個名爲「索引」的第一圖。

my_new_app/views.py文件是這樣的:

from django.shortcuts import render 
from django.http import HttpResponse 

def index(request): 
    return HttpResponse("Hello World!") 

而且你可以在瀏覽器在檢查my_new_app:

http://localhost:8000/my_new_app 

(當然,你可以給任何網址到my_new_app在您的項目的urls.py文件中。)

現在,您可以在您的Django項目中創建另一個名爲my_second_app的應用程序,並且您應該爲該應用程序重複上述步驟。這樣,您將不會有任何問題將來自不同應用的視圖導入到urls.py文件中。對於Django 1.11中的這個問題,這將是一個非常基本的「良好實踐解決方案」。

相關問題