Здравствуйте Возникла проблема, решение которой не могу найти уже несколько дней. Делаю блог с ЧПУ где категории и названия статей пишутся /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('"\' ')