web-dev-qa-db-fra.com

Erreur de chemin Django 2.0?: (2_0.W001) a une route qui contient '(? P <'), commence par un '^' ou se termine par un '$'

Je suis nouveau sur Django et j'essaie de créer le code de base pour une application de musique sur mon site Web.

J'ai créé la vue correcte dans mon fichier views.py (dans le bon répertoire), comme indiqué ci-dessous:

def detail(request, album_id):
    return HttpResponse("<h1>Details for Album ID:" + str(album_id) + "</h1>")

cependant, lors de la création de l'URL ou du chemin d'accès (voir ci-dessous)

#/music/71/ (pk)
path(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),

Je reçois un avertissement sur mon terminal indiquant:

?: (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().

et chaque fois que le /music/ (pour lequel le chemin fonctionne) est suivi d'un numéro, tel que /music/1 (ce que je veux pouvoir faire), la page est introuvable et le terminal donne l'avertissement ci-dessus.

C'est peut-être une simple erreur et juste que je sois stupide, mais je suis nouveau dans les déclarations regex de Django et Python, donc toute aide est appréciée.

29
Joe Tynan

La nouvelle syntaxe path() de Django 2.0 n’utilise pas d’expressions régulières. Vous voulez quelque chose comme:

path('<int:album_id>/', views.detail, name='detail'),

Si vous souhaitez utiliser une expression régulière, vous pouvez utiliser re_path() .

re_path(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),

L'ancien url() fonctionne toujours et est maintenant un alias pour re_path, mais il sera probablement obsolète à l'avenir.

url(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),
56
Alasdair

Pour ajouter à ce que @alasdair a mentionné, j’ai ajouté re_path dans le cadre de l’inclusion et cela fonctionne bien. Voici un exemple

Ajoutez re_path à votre importation (pour Django 2.0)

from Django.urls import path, re_path

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^$', home, name='home'),

]
8
Stryker

Au lieu d'utiliser 're_path', vous pouvez également utiliser '' (chaîne vide) comme premier argument de votre chemin (). Je l'ai utilisé et cela a fonctionné pour moi.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.index,name='index'),
]
5
Akash Gupta

Utilisez une chaîne vide '' au lieu de '/' ou r '^ $'. Il fonctionne comme un charme. Le code est comme ci-dessous:

from Django.urls import path, re_path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home'),
]
1
DILIP

Si cela ne fonctionne pas, ajoutez ce code à votre site\urls.py dans urlpatterns:

path('music/<int:album_id>/', views.detail, name="detail"),
0
Hamza Naji