Django 2.0 path error ?: (2_0.W001) has a route that contains '(?P<', begins with a '^', or ends with a '$'
DjangoDjango ViewsDjango UrlsDjango Problem Overview
I'm trying to create the back-end code for a music application on my website.
I have created the correct view in my views.py file (in the correct directory) as shown below:
def detail(request, album_id):
return HttpResponse("<h1>Details for Album ID:" + str(album_id) + "</h1>")
However, when creating the URL or path for this (shown below)
#/music/71/ (pk)
path(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),
I am experiencing a warning on my terminal stating:
> > ?: (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(). >
And whenever the /music/
(for which the path works) is followed by a number, such as /music/1
(which is what I want to be able to do) the page cannot be found and the terminal gives the above warning.
Django Solutions
Solution 1 - Django
The new path()
syntax in Django 2.0 does not use regular expressions. You want something like:
path('<int:album_id>/', views.detail, name='detail'),
If you want to use a regular expression, you can use re_path()
.
re_path(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),
The old url()
still works and is now an alias to re_path
, but it is likely to be deprecated in future.
url(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),
Solution 2 - Django
Just to add to what @alasdair mentioned, I added re_path as part of the include and it works fine. Here is an example
Add re_path to your import (for django 2.0)
from django.urls import path, re_path
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^$', home, name='home'),
]
Solution 3 - Django
Instead of using 're_path' you can also use ''(empty string) as the first argument of your path(). I have used it and it worked for me.
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.index,name='index'),
]
Solution 4 - Django
If it doesn't work add this code to yoursite\urls.py inside urlpatterns:
path('music/<int:album_id>/', views.detail, name="detail"),
Solution 5 - Django
Use an empty string '' instead of '/' or r'^$'. It works like a charm. Code is as below:
from django.urls import path, re_path
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
]
Solution 6 - Django
url() is deprecated in newer version of django. So instead of using url use re_path() in your urls file as follows:
from django.urls import path, re_path
from . import views
urlpatterns = [
#url(r'^(?P<album_id>[0-9]+)/$', views.detail, name='detail'),
path('', views.index, name='index'),
re_path(r'^(?P<album_id>[0-9])/$', views.detail, name='detail'),
]
Solution 7 - Django
In django 2.0 version primary key write this way...
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.course_list),
path('<int:pk>/', views.course_detail),
]