簡體   English   中英

如果 slug 在 Django 3.0 中使用印度尼西亞語的多語言網站上以“id-”開頭,則會出現 404 錯誤

[英]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

這是由於LocaleMiddlewarei18n_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM