Peransan 404中的Django Slug网址

时间:2019-03-15 04:01:32

标签: python django django-urls slug

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

2 个答案:

答案 0 :(得分:2)

这是对Selcuk回答given here的补充


要传递此类语言/ unicode字符,您必须

  1. Write some custom path converter
  2. 使用re_path() function

1。自定义路径转换器

如果我们研究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()),
    ...
]

2。使用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_]