簡體   English   中英

在Django中生成獨特的slug

[英]Generating unique slug in Django

我已經看到了各種不同的方法來產生獨特的slu :: Ex。 1Ex.2Ex。 3例如 4

我想在保存ModelForm時創建獨特的slu .. 如果我的模型如下:

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創建了第二個2008 iphone 4S對象,那么為這個對象創建一個獨特的slug的最佳方法是什么? 我希望其他對象的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中的slug,這在嘗試找出最佳實踐時一直令人困惑。

非常感謝您對此問題的任何建議和澄清!

首先,命名一個字段“模型”是一個壞主意,它只會造成混亂。 尋找替代方案將是一個好主意。

最簡單的解決方案是在pre_save信號中設置slug:

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'])

我最終使用This Django Snippet來覆蓋我的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的貢獻。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM