7

我目前正在 Django 中开发一个玩具项目。

我的应用程序的一部分允许用户留下评论。我想取评论的标题并对其进行 slugify 以创建一个 url。

因此,如果用户写了一条名为“有史以来最好的东西!”的评论,则 URL 将类似于:www.example.com/reviews/the-best-thing-ever.

这一切都很好,但是处理两个用户选择相同标题的最佳方式是什么?我不想使标题要求是唯一的。

我曾考虑在某处的 url 中添加评论 ID,但我想避免任何不冲突的 url 的额外信息。

有任何想法吗?

4

4 回答 4

6

我会推荐类似AutoSlugField的东西。它有一些关于配置唯一性 (uniqueunique_with) 的可用选项,并且如果您愿意,它还具有能够根据模型上的另一个字段自动生成 slug 的额外好处。

于 2009-09-29T05:21:33.197 回答
6

我从不喜欢独特的 slug 字段/方法的一件事是,如果您对单个标题有很多冲突,您最终将运行多个查询来尝试确定可用的 slug。我知道您提到您不想显示非冲突蛞蝓的 id,但就性能而言,我认为这是更好的选择。为了使 URL 看起来更好看,我更喜欢在 slug 之前嵌入 id,以便 URL 采用 www.example.com/reviews/1/the-best-thing-ever 的形式。

于 2009-09-29T14:25:10.510 回答
2
from django.template.defaultfilters import slugify

def slugify_unique(value, model, slugfield="slug"):
        suffix = 0
        potential = base = slugify(value)
        while True:
            if suffix:
                potential = "-".join([base, str(suffix)])
            if not model.objects.filter(**{slugfield: potential}).count():
                return potential
            suffix += 1      
"""
above function is not my code, but i don't remember exactly where it comes from
you can find many snippets with such solutions searching for 'unique slug' and so
"""


class ReviewForm(forms.ModelForm):

    def save(self, user, commit=True):    
        self.instance.slug = slugify_unique(self.cleaned_data['title'], self.Meta.model)                       
        review = super(ReviewForm, self).save(commit)
        review.save()
        return review

    class Meta:
        model = Review

当然更改适当的名称和表单定义,但你明白了 :)

于 2009-09-29T04:53:03.720 回答
0

我会(在表单验证中)检查是否使用了 slug,然后向其中添加一些东西,要么是数字“my-cool-idea_2”,要么是实际的 id

于 2010-02-26T07:24:34.443 回答