Django不匹配url中的unicode

时间:2018-05-13 23:54:05

标签: python django python-3.x unicode

我有一个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)

在我的网址文件中我有这些模式:

// urls.py

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

现在,如果我去,请说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.

但如果我在没有unicode字符的情况下将项目的slug更改为deuxieme,它可以正常工作,是否有人知道此问题的解决方案?谢谢!

2 个答案:

答案 0 :(得分:2)

urls.py中,将path从使用slug类型更改为str

从此:

    path('posts/<slug:slug>-<int:pk>/', views.PostDetailView.as_view()),

对此:

    path('posts/<str:slug>-<int:pk>/', views.PostDetailView.as_view()),

说明

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

  

匹配任何由ASCII字母或数字以及连字符和下划线字符组成的子字符串。例如,建立您的1st-django网站。

但是我们要保留那些非ASCII字符,因此我们使用str

  

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

答案 1 :(得分:0)

使用unidecode库,并根据slug函数的结果设置unidecode.unidecode字段,此库支持多种语言并自动检测语言,然后用英文字符替换原始字符。 例如,如果你想转换&#34;你好&#34;在中国语言到英文字符,请尝试下面的代码:

$ pip install unidecode
$ python -c "import unidecode; print('---->', unidecode.unidecode('你好'))"
----> Ni Hao