2013-03-04 2 views
2

В первые дни Django можно было предварительно заполнить SlugField в модели.Лучшая практика: предустановить SlugField в Django (без модуля администратора)

В модуле администратора я хотел бы использовать

prepopulated_fields = {'slug':('title',),} 

Я нашел фрагмент кода, который обрабатывает его Unique Slugify, но я сомневаюсь, что это лучший способ.

Так что было бы лучшей практикой для автогенерации SlugField без использования модуля Admin?

Id хотел бы использовать ModelForm для интеграции формы на главной странице, которая должна автогенерировать уникальный пул для URL-адреса.

ответ

2

Это просто вырезано и вставляется из одной из моих старых (как в менее хорошо кодированных) моделях. Это должно показать вам, что идея с небольшим блеском должна работать.

from django.template.defaultfilters import slugify 
def get_nickname(self): 
    nick = self.name 
    vowels = ('a','e','i','o','u') 
    first_letter = nick[:1] 
    nick = nick[1:] 

    for vowel in vowels: nick = nick.replace(vowel,'') 
    nick = first_letter + nick 
    if len(nick) > 8: 
     nick = nick[:7] 
    return nick 

def save(self, force_insert=False, force_update=False, using=None): 
    if not self.nickname: 
     self.nickname = self.get_nickname() if len(self.name)>8 else self.name 
    self.slug = slugify(self.nickname) 
    slug_test = SomeModel.objects.filter(slug=self.slug, id=self.id) # corrected to use a generic model name 
    if slug_test: 
     count = slug_test.count 
     self.slug = "{}{}".format(self.slug[:len(self.slug)-1], count) 

    super(SomeModel, self).save() 

UPDATE: туже код метода get_nick ...

>>> name = 'alabama' 
>>> vowels = {'a', 'e', 'i', 'o', 'u'} 
>>> nick = name[0] + ''.join(l for l in name[1:] if l not in vowels) 
>>> nick 
'albm' 

FWIW: Я просто обновил свою модель, исключая метод get_nickname и добавление простого lambda в верхнюю части методы save :

vowels = {'a','e','i','o','u'} 
create_nick = lambda name: name[0] + ''.join(l for l in name[1:] if l not in vowels)[:7] 
if not self.nickname: 
    self.nickname = create_nick(self.name) if len(self.name)>8 else self.name 
... 
+0

спасибо! Я также нашел еще одно многофункциональное приложение для уникальных слизней [django-autoslug] (https://bitbucket.org/neithere/django-autoslug) –

+0

Несомненно, есть некоторые серьезные сторонние приложения! Я пошел легко, импортировал 'slugify' и добавлял' if slug_test', чтобы обеспечить уникальность. Все мои слова немного глупы, поэтому спасибо за снисхождение – Cole

+0

Ваш ответ определенно легкий и в большинстве случаев лучшее решение - Спасибо за отличное обновление. Но почему вы проверяете гласные и длину? Вы пытаетесь сохранить URL как можно короче? –

Смежные вопросы