![](/img/trans.png)
[英]Django - Generating random, unique slug field for each model object
[英]Generating unique slug in Django
我已经看到了各种不同的方法来产生独特的slu :: Ex。 1 , Ex.2 , Ex。 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.