【问题标题】:Django 2.0 path error ?: (2_0.W001) has a route that contains '(?P<', begins with a '^', or ends with a '$'Django 2.0 路径错误?:(2_0.W001) 的路由包含“(?P<”,以“^”开头,或以“$”结尾
【发布时间】:2018-05-19 13:57:21
【问题描述】:

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

我已经在我的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/&lt;int:album_id&gt;/', ....)。
  • 您正在混合使用新旧 url 语法。将 url 更改为 path('&lt;int:album_id&gt;/', views.detail, name='detail') 或使用 re_path
  • 如果 django 能告诉我们使用什么来代替,那就太好了。

标签: django django-views django-urls


【解决方案1】:

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() 并试图将两者合并在一起,却没有意识到这显然不起作用。
【解决方案2】:

只是为了添加@alasdair 提到的内容,我添加了 re_path 作为包含的一部分,它工作正常。这是一个例子

将 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',您还可以使用 ''(空字符串)作为 path() 的第一个参数。我用过它,它对我有用。

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

    【讨论】:

      【解决方案4】:

      如果不起作用,请将此代码添加到 yoursite\urls.py 的 urlpatterns 中:

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

      【讨论】:

        【解决方案5】:

        使用空字符串 '' 而不是 '/' 或 r'^$'。它就像一个魅力。代码如下:

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

        【讨论】:

          【解决方案6】:

          url() 在较新版本的 django 中已弃用。因此,不要使用 url,而是在 urls 文件中使用 re_path(),如下所示:

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

          【讨论】:

            【解决方案7】:

            在django 2.0版本主键这样写...

            urls.py

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-11-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多