Django 2.0路径错误?:(2_0.W001)具有包含'(?P<',以'^'开头或以'$'结尾的路由。

91

我正试图在我的网站上创建一个音乐应用程序的后端代码。

我已经在我的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(这是我想要做到的),那么页面会找不到并且终端会给出上述警告。

我认为你要么想使用re_path,要么在URL模式中不使用正则表达式(path('music/<int:album_id>/', ....))。 - ayhan
您正在混合使用新旧URL语法。请将URL更改为path('<int:album_id>/', views.detail, name='detail')或使用re_path - Borut
1
如果Django能告诉我们应该使用什么替代品,那就太好了。 - Soren
7个回答

161

Django 2.0中的新path()语法不使用正则表达式。您需要类似于以下内容:

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

谢谢,这个完美地解决了我的问题。我发现我使用的是 url() 而不是 path(),试图将两者合并在一起而没有意识到这显然行不通。 - Joe Tynan

23

仅补充一下@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'),

]

9

除了使用're_path',您还可以将''(空字符串)用作path()的第一个参数。我尝试过这种方法,它对我有效。

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

5

在较新版本的Django中,url()已被弃用。因此,您可以在urls文件中使用re_path()来代替url(),方法如下:

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

3
如果没有起作用,请将以下代码添加到yoursite\urls.py文件的urlpatterns中:
path('music/<int:album_id>/', views.detail, name="detail"),

2

使用空字符串''代替'/'或r'^$'。它像魔法一样有效。代码如下:

from django.urls import path, re_path

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

0
在Django 2.0版本中,主键的写法如下...

urls.py

from django.urls import path

from . import views


urlpatterns = [
    path('', views.course_list),
    path('<int:pk>/', views.course_detail),
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接