Задать вопрос

Как в Django исправить ошибку «UnicodeDecodeError»?

Здравствуйте Возникла проблема, решение которой не могу найти уже несколько дней. Делаю блог с ЧПУ где категории и названия статей пишутся /category/post Вот сами модели
from django.db import models
from pytils import translit
from ckeditor.fields import RichTextField

class Alias(models.Model):
    title = models.CharField(u'Название', max_length=100)
    alias = models.SlugField(max_length=100, blank=True)

    def __unicode__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.alias:
            self.alias = translit.slugify(self.title)
        super(Alias, self).save(*args, **kwargs)

    class Meta:
        abstract = True


class Category(Alias):
    pass

    def get_absolute_url(self):
        from django.core.urlresolvers import reverse_lazy
        return reverse_lazy('blog:category_posts_list', kwargs={'category_alias': self.alias})

    class Meta:
        verbose_name_plural = u"Категории"

class Post(Alias):
    publication_date = models.DateField(u'Дата публикации')
    content = RichTextField(u'Контент')
    category = models.ForeignKey(Category, verbose_name=u'Категория')
    tags = models.ManyToManyField(Tag, verbose_name=u'Метки')

    def get_absolute_url(self):
        from django.core.urlresolvers import reverse
        return reverse('blog:post_detail', args=[self.category.alias, self.alias])

    class Meta:
        verbose_name_plural = u"Записи"


Для ЧПУ берется название категории/статьи и производится транслитерация Из title написанного кирилицей мы получаем латинский alias, который потом используется в url
Все работало отлично Пока не решил добавить хлебные крошки. Для хлебных крошек использовал комплексное решение django sitetree. Собственно хлебные крошки вызывают ошибку UnicodeDecodeError 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128) если переходим по урлу вида /blog/kategorya Если же alias задать изначально латиницей например category то при переходе по урлу /blog/category всё работает отлично

Вот часть кода приложения django sitetree которая вызывает ошибку
if sitetree_item.urlaspattern:
            url = sitetree_item.url
            view_path = url
            all_arguments = []

            if ' ' in url:
                view_path = url.split(' ')
                # We should try to resolve URL parameters from site tree item.
                for view_argument in view_path[1:]:
                    resolved = self.resolve_var(view_argument)
                    # In case of non-ascii data we leave variable unresolved.
                    if isinstance(resolved, six.text_type):
                        if resolved.encode('ascii', 'ignore').decode('ascii') != resolved:
                            resolved = view_argument
                        # URL parameters from site tree item should be concatenated with those from template.
                    all_arguments.append('"%s"' % str(resolved))  # Эта строка вызывает ошибку 
                view_path = view_path[0].strip('"\' ')
  • Вопрос задан
  • 7720 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
mututunus
@mututunus
Backend developer (Python, Golang)
Добавьте этот импорт самым первым.
from __future__ import unicode_literals
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Gasoid
@Gasoid
а почему в модели вначале нету
# -*- coding: utf-8 -*-
Ответ написан
@BigAzat
all_arguments.append('"%s"' % unicode(resolved))
так не пробовали?
И попробуйте изменить
class Alias(models.Model):
    title = models.CharField(u'Название', max_length=100)
    alias = models.SlugField(max_length=100, blank=True)

    def __unicode__(self):
        return u'%s' % (unicode(self.title))
Ответ написан
alternativshik
@alternativshik
up
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы