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'),

)

Он будет работать..