[英]When I change the language of the website, the slug is not translated causing a 404 error
[英]A 404 error if slug begins with “id-” on multilingual website with Indonesian language in Django 3.0
http://example.com/de/id-button/ - 200 OK
http://example.com/id/id-button/ - 200 OK
http://example.com/any-other-slug/ - 200 OK
http://example.com/id-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,
)
該項目在數據庫“id-button”中有一個 slug 字段。 如果我將其重命名為“idbutton”: http://example.com/idbutton/ - 200 OK
但我需要有 url 像: http://example.com/id-button/
更新:它被接受為一個錯誤,但它現在沒有移動: https://code.djangoproject.com/ticket/31540
這是由於LocaleMiddleware
和i18n_patterns
之間的交互。
當LocaleMiddleware
看到請求進來時,它會嘗試從請求中解析語言。 有關使用的正則表達式,請參閱https://github.com/django/django/blob/92507bf3ea4dc467f68edf81a686548fac7ff0e9/django/utils/translation/trans_real.py#L46 。 允許的格式是:任何單詞字符序列,以及可選的破折號和更多單詞字符,之后它需要字符串的結尾或/
。 在這種情況下,它匹配id-domain/
,並理解id-domain
是該請求的語言前綴,從而導致 Django 激活id
語言。
然后,請求通過 URL 路由層,到達https://github.com/django/django/blob/master/django/urls/resolvers.py#L301作為第一站之一。 get_language()
命令返回id
,因此搜索的前綴是id/
, id-domain/
不匹配。 由於LocalePrefixPattern
是頂級解析器,因此它不匹配不會導致其他任何嘗試。
(它是 Django 中的錯誤嗎?也許,我希望它看到id-domain/
作為語言會使其也用於 URL 解析的語言前綴。但即使那樣它也可能無法解決您的問題)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.