http:/example.comdeid-button)。 - 200 OK
http:/example.comid-button。 - 200 OK
http:/example.comany-other-slug。 - 200 OK
http:/example.comid-button - 404错误。
Using the URLconf defined in example.urls, Django tried these URL patterns, in this order:
id/
The current path, id-button/, didn't match any of these.
urls.py文件。
urlpatterns = i18n_patterns(
path('admin/', admin.site.urls),
path('', cache_page(cache_homepage)(homepage_views.index), name='index'),
path('search/', search_views.search, name='search'),
path('<slug:slug>/', item_views.item, name='item'),
prefix_default_language=False,
)
该项目在DB "id-button "中有一个slug字段,如果我将其重命名为 "idbutton"。http:/example.comidbutton)。 - 200 OK
但我需要有一个网址,如 http:/example.comid-button。
更新一下。已接受为BUG,但暂时没动。https:/code.djangoproject.comticket31540。
这是由以下两方面的互动造成的 LocaleMiddleware
和 i18n_patterns
.
当 LocaleMiddleware
看到请求进来,它就会尝试从请求中解析语言。请看 https:/github.comdjangodjangoblob92507bf3ea4dc467f68edf81a686548fac7ff0e9djangoutilstranslationtrans_real.py#L46。 为所用的正则表达式。允许的格式是:任何单词字符的序列,以及可选的破折号和更多的单词字符,之后它期望字符串的结尾,或者是一個 /
. 在这种情况下,它符合 id-domain/
并理解 id-domain
是该请求的语言前缀,使得Django激活了 id
语言。
然后,请求经过URL路由层,作为第一站到达的是 https:/github.comdjangodjangoblobmasterdjangourlsresolvers.py#L301。 . 该 get_language()
命令返回 id
,因此搜索的前缀是 id/
,其中 id-domain/
并不与之匹配。由于 LocalePrefixPattern
是顶层的解析器,它不匹配会导致没有其他的尝试。
(这是Django的一个bug吗?也许吧,我希望它看到 id-domain/
作为语言,会使它也被用于URL解析的语言前缀。但即使这样,也未必能解决你的问题)