我有一个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
,它可以正常工作,是否有人知道此问题的解决方案?谢谢!
答案 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