2

Django の初期の頃は、モデル内に SlugField を事前設定することができました。

管理モジュールで使用します

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

Unique Slugifyを処理するスニペットを見つけましたが、それが最善の方法であるとは思えません。

では、Admin モジュールを使用せずに SlugField を自動生成するベスト プラクティスは何でしょうか?

ModelForm を使用してフォームをフロントページに統合すると、URL の一意のスラッグが自動生成されるはずです。

4

1 に答える 1

2

これは、私の古い (あまり適切にコーディングされていない) モデルの 1 つからカット アンド ペーストしたものです。少し磨きをかけるだけで、うまくいくはずのアイデアが表示されるはずです。

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()

更新: 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単純なものを追加しました。lambdasave

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
...
于 2013-03-04T13:25:56.003 に答える