2012-07-11 44 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中的这个问题,这将是一个非常基本的“良好实践解决方案”。

相关问题