代码之家  ›  专栏  ›  技术社区  ›  TM. Randy Simon

django-slagified-urls-如何处理冲突?

  •  7
  • TM. Randy Simon  · 技术社区  · 16 年前

    我目前正在Django做一个玩具项目。

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

    所以,如果一个用户写了一个叫做“有史以来最好的东西”的评论。,URL类似于: www.example.com/reviews/the-best-thing-ever .

    这很好,但是处理两个用户选择相同标题的情况的最好方法是什么?我不想将标题设置为唯一。

    我已经考虑过在某个地方的url中添加review i d,但是我想避免对任何没有冲突的url使用额外的信息。

    有什么想法吗?

    4 回复  |  直到 16 年前
        1
  •  6
  •   Adam    16 年前

    唯一的slug字段/方法有一点我从来没有喜欢过,那就是如果一个标题有很多冲突,那么最终会运行几个查询来尝试确定一个可用的slug。我知道你说过你不想显示无碰撞弹头的ID,但就性能而言,我认为这是更好的选择。为了让URL看起来更漂亮一点,我更喜欢将ID嵌入到slug之前,这样URL就可以采用www.example.com/reviews/1/the-best-thing-every的形式。

        2
  •  6
  •   Ryan Duffield    16 年前

    我推荐一些像 AutoSlugField . 在配置唯一性方面,它有几个可用的选项( unique unique_with ,如果您选择的话,还可以根据模型上的另一个字段自动生成段塞。

        3
  •  2
  •   zalew    16 年前
    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
    

    当然,更改适当的名称和表单定义,但您会得到这样的想法:)

        4
  •  0
  •   Jared Forsyth    16 年前

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

    推荐文章