Django не соответствует юникоду в URL - PullRequest
0 голосов
/ 14 мая 2018

У меня проблема с django 2.0, когда URL-адрес, содержащий слаг Юникода, не совпадает, я искал решение, но не нашел его для своего случая, вот упрощенная версия моего кода:

// models.py

class Level(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, allow_unicode=True)

в моем файле urls у меня есть эти шаблоны:

// 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.

, ноесли я заменю элемент slug на deuxieme без символа юникода, он будет работать нормально, кто-нибудь знает решение этой проблемы?спасибо!

Ответы [ 2 ]

0 голосов
/ 29 июля 2018

In urls.py изменить путь с использования типа slug на str.

Из этого:

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

к этому:

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

Объяснение

Как указано в комментариях, slug преобразователь пути

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

но мы хотим сохранить эти символы не ascii, поэтому мы используем str:

str - Соответствует любой непустой строке, кроме разделителя пути, '/'. Это значение по умолчанию, если конвертер не включен в выражение.

0 голосов
/ 14 мая 2018

Используйте библиотеку unidecode и установите поле slug по результатам функции unidecode.unidecode, эта библиотека поддерживает многие языки и автоматически определяет язык, а затем заменяет оригинальные символы английскими символами. Например, если вы хотите преобразовать слово «Hello» на китайском языке в английские символы, попробуйте следующий код:

$ pip install unidecode
$ python -c "import unidecode; print('---->', unidecode.unidecode('你好'))"
----> Ni Hao
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...