您的位置:

django有ValueError("Non-reversible reg-exp portion: '(?%s'" % ch)else:ch, escaped = next(pattern_iter)if ch not in ("<", "="):ValueError("Non-reversible reg-exp portion: '(?P%s'" % ch)# We are in a named capturing group. Extra the name and# then skip to the end.if ch == "<":terminal_char = ">"# We are in a named backreference.else:terminal_char = ")"name = []ch, escaped = next(pattern_iter)while ch != terminal_char:name.append(ch)ch, escaped = next(pattern_iter)param = "".join(name)# Named backreferences have already consumed the# parenthesis.if terminal_char != ")":报错是怎么回事

  发布时间:2023-04-05 11:59:26
报错的原因这个错误是因为在使用Django的URL路由功能时,在正则表达式中出现了一个不能反向匹配的部分。这个错误通常是由于在正则表达式中使用了命名捕获组或命名反向引用,而Django在处理这些部分时无法反向匹配。最后,如果您确实需要在URL路由中使用正则表达式,可以考虑使用Django的re_path()函数来定义URL路由,这个函数允许您使用任意的正则表达式,而不会导致反向匹配错误。

报错的原因

这个错误是因为在使用Django的URL路由功能时,在正则表达式中出现了一个不能反向匹配的部分。这个错误通常是由于在正则表达式中使用了命名捕获组或命名反向引用,而Django在处理这些部分时无法反向匹配。

如何解决

为了解决这个错误,需要确保在URL路由中使用的正则表达式能够被Django反向匹配。

可以尝试更换正则表达式,避免使用命名捕获组或命名反向引用。更换后确保可以反向匹配即可。

或者使用可以反向匹配的命名捕获组,在Django2.2+版本中支持在命名捕获组前面加上"?"来指明这是可以反向匹配的命名捕获组。

可以阅读Django文档关于URL routing and regular expression documentation,来获取更多关于解决这个问题的信息

另外,也可以考虑在URL路由中使用具名参数(例如)来代替正则表达式,这样可以避免使用正则表达式而导致的错误。

最后,如果您确实需要在URL路由中使用正则表达式,可以考虑使用Django的re_path()函数来定义URL路由,这个函数允许您使用任意的正则表达式,而不会导致反向匹配错误。

使用例子

是的,下面是一个例子:

使用path()函数定义URL路由


from django.urls import path
from . import views

urlpatterns = [
    path('/', views.detail_view, name='detail'),
]

使用re_path()函数定义URL路由


from django.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^(?P\d+)/$', views.detail_view, name='detail'),
]

使用命名捕获组反向匹配:


from django.urls import path
from . import views

urlpatterns = [
    path('/', views.detail_view, name='detail'),
    path('//', views.detail_view_name, name='detail_name'),
]

这样在view里面就可以直接用id和name来取数据了。