xozzslip
@xozzslip

Как осуществить транслитерацию урлов в django?

Можно ли сделать так, чтобы поле бд было на русском языке, а ссылка на него транслитерировалась на английский.
deck_name = 'физика'
url = 'app/fizika'

Пробовал делать через templatetags, но вскоре понял, что просто меняя url, меняется и передаваемое значение. То есть вместо 'физика' передастся 'fizika', а поля с таким именем в бд нет. Что наталкивает на мысль, что сделать это можно лишь при помощи добавления нового поля. Но как сделать новое поле, которое по умолчанию будет иметь значение другого поля, на которое подействовала функция?
Вроде такого. C upper case для простоты.
class Deck(models.Model):
        name = models.CharField(max_length = 30)
        name_eng  = models.CharField(max_length=30, default=name.upper())


UPD: Хочу предупредить новичков, которые будут использовать slug: учтите, что при парсинге урлов регулярное выражение должно быть [\w-], а не просто \w, т.к в slug пробелы заменяются на '-'
  • Вопрос задан
  • 8115 просмотров
Решения вопроса 1
@deliro
Это называется slug (или ЧПУ, если по-русски). К сожалению, джанговская функция slugify не понимает кириллицу, поэтому я для одного из своих проектов написал обёртку для работы кириллицы. Посмотреть можно здесь: https://gist.github.com/deliro/01851103f7a0206fe66d

class Deck(models.Model):
    slug = models.SlugField()
    name = models.CharField(max_length=30)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super().save(*args, **kwargs)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
pinkevich
@pinkevich
Developer
pip install pytils
from pytils.translit import slugify
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы