Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中生成唯一的slug_Python_Django_Unique_Slug_Modelform - Fatal编程技术网

Python 在Django中生成唯一的slug

Python 在Django中生成唯一的slug,python,django,unique,slug,modelform,Python,Django,Unique,Slug,Modelform,我见过各种不同的方法来生成独特的段塞:,,等等 我想在保存模型表单时创建唯一的slug。如果我的模型是: class Phone(models.Model): user = models.ForeignKey(User) slug = models.SlugField(max_length=70, unique=True) year = models.IntegerField() model = models.ForeignKey('Model') ser

我见过各种不同的方法来生成独特的段塞:,,等等

我想在保存模型表单时创建唯一的slug。如果我的模型是:

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

我希望此对象的url显示为:

http://www.mysite.com/phones/dude-2008-iphone-4S 
我知道我应该使用
slagify
通过信号或通过save方法来实现这一点。但是,如果用户杜德创建了第二个2008年iphone 4S对象,那么为该对象创建一个独特的slug的最佳方法是什么?我希望其他对象的url如下所示:

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

谷歌搜索之后,在django中似乎有各种不同的创建slug的方法,在试图找出最佳实践时,这些方法令人困惑


非常感谢您对这个问题的任何建议和澄清

首先,将字段命名为“Model”是个坏主意,它只会造成混乱。找到一个替代品将是一个好主意

最简单的解决方案是在信号中设置缓动:

或者使用,它看起来像这样:

slug = AutoSlugField(unique_with=['user__username', 'year', 'model__name', 'series__name'])
最后,我在models.py中使用了超越手机保存方法的功能

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的贡献。

感谢您的回复@jpic。我尝试使用
unique\u和
以及您描述的参数来实现autoslugfield,但是生成的slug不正确。slug是由模型名称生成的,在这种情况下slug是
Phone
,这不是期望的结果。也许我的实现中遗漏了一些东西。。感谢您提供的任何其他想法,我说“类似”,但我还没有阅读文档并测试您的特定用例,您阅读文档了吗?此外,我还添加了一个更简单的解决方案(不需要阅读文档)。是的,我阅读了文档,但尚未找到问题的答案。我会尝试你的其他解决方案,并让你知道。非常感谢你!
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)
slug = AutoSlugField(unique_with=['user__username', 'year', 'model__name', 'series__name'])
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()