Ошибка пути 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"),