Django不匹配URL中的unicode

nab*_*don 6 python django unicode python-3.x

我在django 2.0中遇到问题,其中包含unicode slug的url不匹配,我搜索了一种解决方案,但没有找到适合我的情况的解决方案,这是我的代码的简化版本:

// models.py

class Level(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, allow_unicode=True)
Run Code Online (Sandbox Code Playgroud)

在我的url文件中,我具有以下模式:

// urls.py

urlpatterns = [
path('', views.index, name='index'),
path('level/<slug:level_slug>', views.level, name='level')]
Run Code Online (Sandbox Code Playgroud)

现在,如果我走,对http://127.0.0.1:8000/game/level/deuxième我说这个错误:

Request Method: GET
Request URL:    http://127.0.0.1:8000/game/level/deuxi%C3%A8me

Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order:

game/ [name='index']
game/level/<slug:level_slug> [name='level']
admin/
accounts/
The current path, game/level/deuxième, didn't match any of these.
Run Code Online (Sandbox Code Playgroud)

但是,如果我将项目的slug更改为deuxieme不带unicode字符,则可以正常工作,有人知道该问题的解决方案吗?谢谢!

mar*_*nuy 10

urls.py路径从使用slug类型更改为str.

由此:

    path('posts/<slug:slug>-<int:pk>/', views.PostDetailView.as_view()),
Run Code Online (Sandbox Code Playgroud)

对此:

    path('posts/<str:slug>-<int:pk>/', views.PostDetailView.as_view()),
Run Code Online (Sandbox Code Playgroud)

解释

正如评论中所建议的,slug路径转换器

匹配由 ASCII 字母或数字以及连字符和下划线字符组成的任何 slug 字符串。例如,building-your-1st-django-site。

但我们想保留那些非 ascii 字符,所以我们使用str

str - 匹配任何非空字符串,不包括路径分隔符“/”。如果表达式中不包含转换器,则这是默认设置。


M.j*_*vid 0

使用该unidecode库,并slug通过函数结果设置字段unidecode.unidecode,该库支持多种语言,并自动检测语言,然后将原始字符替换为英文字符。\n例如,如果要将中文中的“Hello”单词转换为英文字符,尝试下面的代码:

\n\n
$ pip install unidecode\n$ python -c "import unidecode; print(\'---->\', unidecode.unidecode(\'\xe4\xbd\xa0\xe5\xa5\xbd\'))"\n----> Ni Hao\n
Run Code Online (Sandbox Code Playgroud)\n