В общем, возможно вопрос довольно глупый, но пытаюсь сделать минимальный код(типа DRY и все такое). Я пишу проект на CMS Mezzanine, в ней есть предопределенные модели из которых можно быстро слепить свои. И есть в одной из стандартных моделей, а именно mezzanine.core.models.Slugged, которая собственно и предназначена для ЧПУ, поле slug. От этой модели унаследована куча других моделей, которые тоже используются. Меня крайне парит то, что оно не переводит кириллические символы в латиницу, т.е. "Привет Вася" после сохранения будет "привет-вася", а не "privet_vasia". Имхо, так лучше, кроме того {% url %} меня за кириллицу ругает. Путем двухминутного просмотра исходников был обнаружен метод get_slug(), который отдает делает этот самый slug. Короче, после некоторого труда появился такой класс:
import re, unidecode
class AnsiSlug(object):
class Meta:
abstract = True
def get_slug(self, **kwargs):
exp=re.compile('[^a-z0-9]')
slug = exp.split(unidecode.unidecode(kwargs.get("field", self.title)).lower())
slug = [x for x in slug if x != '']
return "_".join(slug)
def check_slug(self, *args, **kwargs):
exp = re.compile('[^a-zA=Z0-9_]')
if exp.search(self.slug):
self.slug = self.get_slug(field=self.slug)
Он слегка кривоват, сам вижу, но вопрос не в этом. Теперь мне нужно в каждой модели, которая унаследована от Slugged напрямую или через несколько переопределять save(), что, Имхо, не есть гут(опять же DRY и все такое)
Например:
class Category(AnsiSlug, Page):
class Meta:
verbose_name = u"Раздел"
verbose_name_plural = u"Разделы"
def __unicode__(self):
return self.title
def save(self, *args, **kwargs):
self.check_slug()
super(Category, self).save(*args, **kwargs)
Так вот, можно ли как-нибудь избежать этого? Может сделать CategoryAdmin и с ним поиграться?