URL-адрес пули Джанго в Перисане 404 - PullRequest
3 голосов
/ 15 марта 2019

У меня есть URL-адрес Django:

path('question/<slug:question_slug>/add_vote/', views.AddVoteQuestionView.as_view())

Он отлично работает с английским слагом, но когда слизняк персидский, примерно так:

/question/سوال-تست/add_vote/

Django url throw 404 Not Found, есть ли решение, чтобы поймать этот URL Perisan Slug?

EDIT:

Я использую django 2.1.5.

Он отлично работает с этим URL:

re_path(r'question/(?P<question_slug>[\w-]+)/add_vote/$', views.AddVoteQuestionView.as_view())

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Это дополнение к Сельчук ответ здесь


для передачи таких символов языка / юникода вам необходимо

  1. Напишите какой-нибудь собственный конвертер пути
  2. Использование re_path() функция

1. Конвертер пользовательских путей

Если мы посмотрим на исходный код Django, преобразователь пути slug использует это регулярное выражение,
[-a-zA-Z0-9_]+, что неэффективно здесь (см. ответ Сельчука).

Итак, напишите свой собственный конвертер слагов, как показано ниже

<b>from django.urls.converters import SlugConverter</b>


class CustomSlugConverter(<b>SlugConverter</b>):
    <b>regex = '[-\w]+' # new regex pattern</b>

Тогда зарегистрируйте его,

<b>from django.urls import path, register_converter

register_converter(CustomSlugConverter, 'custom_slug')</b>

urlpatterns = [
    path('question/<b>&ltcustom_slug:question_slug></b>/add_vote/', views.AddVoteQuestionView.as_view()),
    ...
]

2. используя re_path()

Вы уже попробовали и преуспели с этим методом. Во всяком случае, я здесь и смотри:)

from django.urls import re_path

urlpatterns = [
    re_path(r'question/<b>(?P&ltquestion_slug>[\w-]+)/</b>add_vote/$', views.AddVoteQuestionView.as_view()),
    ...
]
0 голосов
/ 15 марта 2019

Согласно документации Django 2.1 вы можете использовать только буквы или цифры ASCII для slug паттернов:

slug - Соответствует любой строке слагов, состоящей из букв ASCII илицифры, плюс дефис и символы подчеркивания.Например, building-your-1st-django-site.

, тогда как шаблон регулярного выражения \w также соответствует символам слова Юникод:

https://docs.python.org/3/library/re.html#index-32

Для Unicode (str) шаблоны: соответствует символам Unicode;это включает в себя большинство символов, которые могут быть частью слова на любом языке, а также цифры и подчеркивание.Если используется флаг ASCII, сопоставляется только [a-zA-Z0-9_].

...