Django slugfield изменяет символы юникода при сохранении и вызывает обратную ошибку отсутствия совпадения - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь создать ярлыки Unicode с помощью Django. Проблема возникает, когда он пытается сохранить и разрешить URL-адреса с указанными слагами с символами Unicode в них. Когда я проверил, кажется, что Django изменяет символы при использовании SlugField.

Это мой models.py:

class Post(models.Model):
    title = models.CharField()
    slug = models.SlugField(unique=True, blank=True, allow_unicode=True)

urls.py

from django.urls import path

from . import views


app_name = 'blog'
urlpatterns = [
    # Cat
    path('', views.CatList.as_view(), name='cat-list'),
    path('create/', views.CatCreate.as_view(), name='cat-create'),
    path('<slug:cat_slug>/', views.CatDetail.as_view(), name='cat-detail'),
    path('<slug:cat_slug>/edit/', views.CatEdit.as_view(), name='cat-edit'),

    # Post
    path('<slug:cat_slug>/posts/', views.CatDetail.as_view(), name='post-list'),    
    path('<slug:cat_slug>/posts/create/', views.PostCreate.as_view(), name='post-create'),
    path('<slug:cat_slug>/posts/<slug:post_slug>/', views.PostDetail.as_view(), name='post-detail'),
    path('<slug:cat_slug>/posts/<slug:post_slug>/edit/', views.PostEdit.as_view(), name='post-edit')
]   

И я использую slugify(slug, allow_unicode=True) для автоматического создания slug из title.

Итак, чтобы проверить это, я использовал தமிழ் как title. Вместо успешного перенаправления на URL-адрес /cats/test-cat/posts/தமிழ்/ Django показано исключение NoReverseMatch со следующим сообщением.

Reverse for 'post-detail' with arguments '('test-cat', 'zw93tz-தமழ')' not found. 1 pattern(s) tried: ['cats/(?P<cat_slug>[-a-zA-Z0-9_]+)/posts/(?P<post_slug>[-a-zA-Z0-9_]+)/$']

Когда я проверяю базу данных, поле title имеет правильные символы தமிழ் но поле slug содержит измененные символы தமழ.

Когда я искал решения, я нашел обходной путь для использования <str> вместо <slug> в urls.py.

Почему это происходит с <slug> и как это исправить?

...