4

ユニークなスラッグを生成するためのさまざまな方法を見てきました。1Ex.2Ex. 3例。4など

ModelForm の保存時に固有のスラッグを作成したいと考えています。私のモデルが次のような場合:

class Phone(models.Model):
    user = models.ForeignKey(User)
    slug = models.SlugField(max_length=70, unique=True)
    year = models.IntegerField()
    model = models.ForeignKey('Model')
    series = models.ForeignKey('Series')

オブジェクトが次の値を持っているとしPhoneます (送信された ModelForm を介して):

Phone.user = dude
Phone.year = 2008
Phone.model = iphone
Phone.series = 4S

このオブジェクトの URL を次のように表示します。

http://www.mysite.com/phones/dude-2008-iphone-4S 

slugifyこれを実現するには、シグナルを介して使用するか、save メソッドをオーバーライドする必要があることを理解しています。しかし、ユーザーdudeが 2 番目の 2008 iphone 4S オブジェクトを作成した場合、このオブジェクトに固有のスラッグを作成する最善の方法は何でしょうか? 追加オブジェクトの URL を次のようにしたい:

http://www.mysite.com/phones/dude-2008-iphone-4S-2

http://www.mysite.com/phones/dude-2008-iphone-4S-3
http://www.mysite.com/phones/dude-2008-iphone-4S-4
#...etc ...

グーグルで調べたところ、django でスラッグを作成するさまざまな方法があるようで、ベスト プラクティスを見つけようとすると混乱しました。

この問題に関するアドバイスと明確化に感謝します!

4

2 に答える 2

3

まず第一に、フィールドに「モデル」という名前を付けることは、混乱を招くだけであり、悪い考えです。代替手段を見つけることは良い考えです。

最も簡単な解決策は、pre_saveシグナルでスラッグを設定することです。

from django.db.models.signals import pre_save
from django.template.defaultfilters import slugify


def phone_slug(sender, instance, **kwargs):
    slug = u'%s-%s-%s-%s' % (slugify(instance.user.username), instance.year,
        slugify(instance.model), slugify(instance.series))
    instance.slug = slug

    if instance.pk:
        other_phones = Phone.objects.exclude(pk=instance.pk)
    else:
        other_phones = Phone.objects.all()

    i = 2
    exists = other_phones.filter(slug=instance.slug).count() > 0
    while exists:
        instance.slug = u'%s-%s' % (slug, i)
        i++
pre_save.connect(phone_slug, sender=Phone)

または、 django-autoslugを使用すると、次のようになります。

slug = AutoSlugField(unique_with=['user__username', 'year', 'model__name', 'series__name'])
于 2012-09-19T00:02:48.943 に答える
2

この Django スニペットを使用して、models.py の Phone の save メソッドをオーバーライドしました。

def save(self, **kwargs):
    slug_str = "%s %s %s %s" % (self.user, self.year, self.model, self.series)
    unique_slugify(self, slug_str)
    super(Phone, self).save()

しかし、貢献してくれた jpic に感謝します。

于 2012-10-17T02:51:31.093 に答える