我有一个Django网址:
path('question/<slug:question_slug>/add_vote/', views.AddVoteQuestionView.as_view())
它对英语很有效,但是当是波斯语时,是这样的:
/question/سوال-تست/add_vote/
django网址抛出404 Not Found
,有什么解决方案可以捕获此peransan slug网址吗?
编辑:
我正在使用Django 2.1.5。
此网址可以正常使用
:re_path(r'question/(?P<question_slug>[\w-]+)/add_vote/$', views.AddVoteQuestionView.as_view())
答案 0 :(得分:2)
这是对Selcuk回答given here的补充
要传递此类语言/ unicode字符,您必须
如果我们研究Django的源代码,则slug
路径转换器将使用此正则表达式,
[-a-zA-Z0-9_]+
在这里无效(请参见Selcuk的答案) 。
因此,如下所示编写您自己的自定义子弹转换器
from django.urls.converters import SlugConverter
class CustomSlugConverter(SlugConverter):
regex = '[-\w]+' # new regex pattern
然后注册,
from django.urls import path, register_converter
register_converter(CustomSlugConverter, 'custom_slug')
urlpatterns = [
path('question/<custom_slug:question_slug>/add_vote/', views.AddVoteQuestionView.as_view()),
...
]
re_path()
您已经尝试并成功使用此方法。无论如何,我在这里c&p:)
from django.urls import re_path
urlpatterns = [
re_path(r'question/(?P<question_slug>[\w-]+)/add_vote/$', views.AddVoteQuestionView.as_view()),
...
]
答案 1 :(得分:0)
根据Django 2.1 documentation,您只能将ASCII字母或数字用于slug
模式:
slug
-匹配由ASCII字母或数字以及连字符和下划线字符组成的任何条形字符串。例如,building-your-1st-django-site
。
而正则表达式\w
模式也与Unicode文字字符匹配:
https://docs.python.org/3/library/re.html#index-32
对于Unicode(str)模式: 匹配Unicode单词字符;这包括可以用任何语言组成的单词的大多数字符,以及数字和下划线。如果使用ASCII标志,则仅匹配
[a-zA-Z0-9_]
。