django-ошибка импорта: нет модуля с именем views
Я ломал голову и не могу понять, почему должна быть ошибка импорта, когда импортируются "представления". При посещении индексной страницы я получаю следующее сообщение:
"
Request Method: GET
Request URL: http://127.0.0.1:8000/moments/
Django Version: 1.6.1
Exception Type: ImportError
Exception Value:
No module named views
Exception Location: C:Python27libsite-packagesdjangoutilsimportlib.py in import_module, line 40
"
вот мой urls.py
from django.conf.urls import patterns, url
from moments_app import views
urlpatterns = patterns('',
url(r'^$', "views.index", name='index'),
url(r'^$', "views.choose_dataset", name='choose'),
url(r'^get_moments/', "views.get_moments", name='get_moments'),
url(r'^learn/$', "views.learn", name='learn'),
url(r'^(?P<moment_id>d+)/$', "views.detail", name='detail'),
)
у меня явно есть модуль с именем views в моей папке moments_app. Кроме того, moments_app находится на моем пути. У кого-нибудь есть идеи, что может быть причиной этого?
3 ответов
вы префикс имена маршрутов с относительные имя модуля. Используйте абсолютное имя:
urlpatterns = patterns('',
url(r'^$', "moments_app.views.index", name='index'),
url(r'^$', "moments_app.views.choose_dataset", name='choose'),
url(r'^get_moments/', "moments_app.views.get_moments", name='get_moments'),
url(r'^learn/$', "moments_app.views.learn", name='learn'),
url(r'^(?P<moment_id>\d+)/$', "moments_app.views.detail", name='detail'),
)
или еще лучше, используйте первый аргумент, чтобы указать полный путь к модулю:
urlpatterns = patterns('moments_app.views',
url(r'^$', "index", name='index'),
url(r'^$', "choose_dataset", name='choose'),
url(r'^get_moments/', "get_moments", name='get_moments'),
url(r'^learn/$', "views.learn", name='learn'),
url(r'^(?P<moment_id>\d+)/$', "detail", name='detail'),
)
хотя комбинация этих двух Также допускается:
urlpatterns = patterns('moments_app',
url(r'^$', "views.index", name='index'),
url(r'^$', "views.choose_dataset", name='choose'),
url(r'^get_moments/', "views.get_moments", name='get_moments'),
url(r'^learn/$', "views.learn", name='learn'),
url(r'^(?P<moment_id>\d+)/$', "views.detail", name='detail'),
)
два года обновление:
в Django 1.8 и позже как строковые представления, так и patterns
функция устарела, что приводит к более простому и надежному синтаксису:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^$', views.choose_dataset, name='choose'),
url(r'^get_moments/', views.get_moments, name='get_moments'),
url(r'^learn/$', views.learn, name='learn'),
url(r'^(?P<moment_id>\d+)/$', views.detail, name='detail'),
]
обратите внимание, что нет" относительных "или" абсолютных " имен представлений с вызываемым синтаксисом - если вы импортируете
вы импортировали свое представление как
from moments_app import views
несколько раз это не сработает.
использовать
from moments_app.views import *
urlpatterns = patterns('',
url(r'^$', index, name='index'),
url(r'^$', choose_dataset, name='choose'),
url(r'^get_moments/', get_moments, name='get_moments'),
url(r'^learn/$', learn, name='learn'),
url(r'^(?P<moment_id>\d+)/$', detail, name='detail'),
)
Он будет работать..