Ошибка пути Django 2.0?: (2_0.W001) имеет маршрут, который содержит '(? P <', начинается с символа '^' или заканчивается символом '$'
Я новичок в Django и пытаюсь создать внутренний код для музыкального приложения на моем сайте.
Я создал правильное представление в моем файле views.py (в правильном каталоге), как показано ниже:
def detail(request, album_id):
return HttpResponse("<h1>Details for Album ID:" + str(album_id) + "</h1>")
однако при создании URL или пути для этого (показано ниже)
#/music/71/ (pk)
path(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),
На моем терминале появляется предупреждение о том, что:
?: (2_0.W001) Your URL pattern '^(?P<album_id>[0-9])/$' [name='detail'] has a route that contains '(?P<', begins with a '^', or ends with a '$'. This was likely an oversight when migrating to django.urls.path().
и всякий раз, когда за /music/
(для которого работает путь) следует номер, такой как /music/1
(что я и хочу сделать), страница не может быть найдена, и терминал выдает вышеупомянутое предупреждение.
Это может быть простая ошибка, и я просто глуп, но я новичок в выражениях Django и регулярных выражений Python, поэтому любая помощь приветствуется.
Ответы
Ответ 1
Новый синтаксис path()
в Django 2.0 не использует регулярные выражения. Вы хотите что-то вроде:
path('<int:album_id>/', views.detail, name='detail'),
Если вы хотите использовать регулярное выражение, вы можете использовать re_path()
.
re_path(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),
Старый url()
по-прежнему работает и теперь является псевдонимом re_path
, но скорее всего он будет устаревшим в будущем.
url(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),
Ответ 2
Просто чтобы добавить к тому, что упомянуто @alasdair, я добавил re_path как часть include, и он отлично работает. Вот пример
Добавьте re_path в ваш импорт (для django 2.0)
from django.urls import path, re_path
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^$', home, name='home'),
]
Ответ 3
Вместо использования 're_path' вы также можете использовать '' (пустую строку) в качестве первого аргумента вашего пути(). Я использовал это, и это сработало для меня.
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.index,name='index'),
]
Ответ 4
Используйте пустую строку '' вместо '/' или r '^ $'. Отлично работает. Код как ниже:
from django.urls import path, re_path
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
]
Ответ 5
Если это не работает, добавьте этот код в yoursite\urls.py внутри urlpatterns:
path('music/<int:album_id>/', views.detail, name="detail"),