【问题标题】:What is a "slug" in Django?Django 中的“蛞蝓”是什么?
【发布时间】:2010-09-30 10:30:28
【问题描述】:

当我阅读 Django 代码时,我经常在模型中看到所谓的“slug”。我不太确定这是什么,但我知道它与 URL 有关。这个蛞蝓应该如何以及何时使用?

(我在this glossary中阅读了它的定义。)

【问题讨论】:

  • 若要立即了解,请查看您所在网站的 URL:https://stackoverflow.com/questions/{id}/{slug}

标签: python django url django-models slug


【解决方案1】:

slug 是 URL 的一部分,它以易于阅读的形式标识网站上的特定页面。

例如,/building-your-1st-django-site

只有蛞蝓包含:

  • 字母:a-z,A-Z
  • 数字:0-9
  • 下划线:_
  • 连字符:-

【讨论】:

    【解决方案2】:

    它是一种生成有效 URL 的方式,一般使用已经获得的数据。例如,使用文章的标题生成 URL。

    【讨论】:

      【解决方案3】:

      简而言之,slug 可以帮助摆脱那些带有有效网址的丑陋网址,例如电子商务网站中的示例,而不是将网址显示为www.myecom.com/product/5432156,我可以在 slug 的帮助下将其显示为www.myecom.com/product/iphone11

      【讨论】:

        【解决方案4】:

        “蛞蝓”一词来自报纸制作领域。

        这是在制作过程中给故事起的非正式名称。随着故事从节拍记者(假设这些甚至存在?)到编辑再到“印刷机”,这就是它所引用的名称,例如,“有你修复了“凯特和威廉”故事中的那些错误?”。

        某些系统(例如 Django)使用 slug 作为 URL 的一部分来定位故事,例如 www.mysite.com/archives/kate-and-william

        甚至 Stack Overflow 本身也会这样做,使用 GEB-ish(a) 自我引用 https://stackoverflow.com/questions/427102/what-is-a-slug-in-django/427201#427201,尽管您可以将 slug 替换为 blahblah,它仍然会发现它没问题。

        它甚至可以追溯到更早的时候,因为剧本在每个场景的开头都有“辅助线”,这基本上设置了那个场景的背景(地点、时间等)。它非常相似,因为它是以下内容的概要或序言。

        在 Linotype 机器上,slug 是由单个字母形式创建的单线金属片。通过为整行制作单个 slug,这大大改进了旧的逐字符合成。

        虽然以下内容纯属猜想,但 slug 的早期含义是指伪造的硬币(必须以某种方式压制)。我可以设想将这种用法转变为印刷术语(因为必须使用原始字符来压制 slug),然后从那里从“金属片”的定义变为“故事摘要”的定义。从那里,从正确的印刷到在线世界仅一步之遥。


        (a) “哥德尔·埃舍尔,巴赫”,作者 Douglas Hofstadter,我(至少)认为这是伟大的现代智力作品之一。您还应该看看他的另一部作品“Metamagical Themas”。

        【讨论】:

          【解决方案5】:

          “slug”是一种生成有效 URL 的方法,通常使用已经获得的数据。例如,slug 使用文章的标题来生成 URL。我建议通过给定标题(或另一条数据)的函数来生成 slug,而不是手动设置它。

          一个例子:

          <title> The 46 Year Old Virgin </title>
          <content> A silly comedy movie </content>
          <slug> the-46-year-old-virgin </slug>
          

          现在让我们假设我们有一个 Django 模型,例如:

          class Article(models.Model):
              title = models.CharField(max_length=100)
              content = models.TextField(max_length=1000)
              slug = models.SlugField(max_length=40)
          

          您将如何使用 URL 和有意义的名称引用此对象?例如,您可以使用 Article.id,这样 URL 将如下所示:

          www.example.com/article/23
          

          或者,您可能希望像这样引用标题:

          www.example.com/article/The 46 Year Old Virgin
          

          由于 URL 中的空格无效,因此必须将其替换为 %20,这会导致:

          www.example.com/article/The%2046%20Year%20Old%20Virgin
          

          这两种尝试都没有产生非常有意义、易于阅读的 URL。这样更好:

          www.example.com/article/the-46-year-old-virgin
          

          在此示例中,the-46-year-old-virgin 是一个 slug:它是通过将所有字母向下大小写并用连字符 - 替换空格从标题创建的。

          另请参阅此网页的 URL 以获取另一个示例。

          【讨论】:

          • 很好的描述,但是要补充一点:SlugField 并不能保证开箱即用的唯一性,所以如果默认使用它,这是一个更好的 URL:www.example.com/article/the-40 -year-old-virgin/23/ 其中“23”是 article.id,是实际用于查询的内容(也比在 slug 上查询更快)。
          • 我发现 www.example.com/article/23/the-40-year-old-virgin 更容易阅读。
          • 如果您根据 id 提供内容,请决定是检查 slug 是否与内容匹配(如果不匹配则返回 404)或完全忽略它。我不认为有什么是最好的,搜索引擎优化的一般规则。如果您在浏览器中输入stackoverflow.com/questions/427102/…,SO 仍会显示此页面。
          • @Eno 确实不需要隐藏数据库 ID - 假设您的所有 URL 无论如何都是公开的。
          • @Eno 为 SEO 和永久链接 nicey-ness 添加了 slug。 ID 用于索引查找。 stackoverflow 的 SEO 非常出色——他们正是使用这种策略。您的论点是“隐藏数据库 ID”,您现在已将其转为“SEO”。怎么了?
          【解决方案6】:

          蛞蝓是一个报纸术语。 slug 是某事物的短标签,仅包含字母、数字、下划线或连字符。它们通常用于 URL。 (如在 Django 文档中)

          Django 中的 slug 字段用于为您动态创建的网页存储和生成有效的URLs

          就像您在 Stack Overflow 上添加此问题并生成动态页面的方式一样,当您在地址栏中看到时,您会看到您的问题标题用“-”代替空格。这正是蛞蝓场的工作。

          你输入的标题是这样的 -> Django 中的“slug”是什么?

          在将其存储到 slug 字段时,它会变成“what-is-a-slug-in-django”(请参阅​​此页面的 URL)

          【讨论】:

            【解决方案7】:

            蛞蝓

            某事物的短标签,仅包含字母、数字、下划线或连字符。它们通常用于 URL。例如,在典型的博客条目 URL 中:

            https://www.djangoproject.com/weblog/2008/apr/12/spring/ 最后一点(弹簧)是蛞蝓。

            【讨论】:

              【解决方案8】:

              Slug 是特定内容的 URL 友好短标签。它只包含字母、数字、下划线或连字符。 Slugs 通常与各自的内容一起保存,并作为 URL 字符串传递。

              Slug 可以使用 SlugField 创建

              例如:

              class Article(models.Model):
                  title = models.CharField(max_length=100)
                  slug = models.SlugField(max_length=100)
              

              如果你想使用title作为slug,django有一个简单的函数叫做slugify

              from django.template.defaultfilters import slugify
              
              class Article(models.Model):
                  title = models.CharField(max_length=100)
              
                  def slug(self):
                      return slugify(self.title)
              

              如果需要唯一性,请在 slug 字段中添加unique=True

              例如,从前面的例子:

              class Article(models.Model):
                  title = models.CharField(max_length=100)
                  slug = models.SlugField(max_length=100, unique=True)
              

              你懒得做 slug 过程吗?别担心,这个插件会帮助你。 django-autoslug

              【讨论】:

                【解决方案9】:

                如果我可以提供一些历史背景:

                “slug” 一词与铸造金属(在本例中为铅)有关,印刷字体就是由这种金属制成的。然后,每张纸的字体工厂都会定期重新熔化并在新模具中重铸,因为经过多次印刷后,它们会磨损。像我这样的学徒在那里开始了他们的职业生涯,并一路走上顶峰(不再)。

                排版必须以反向的方式撰写文章的文本,并以明智的方式堆叠前导字符。所以在印刷时,这些字母会直接在纸上。所有的印刷版都可以像印刷版一样快速阅读镜像的报纸。因此,蛞蝓,(如蜗牛)和缓慢的故事(最后被修复)很多都在板凳上等待,仅通过他们的第一个字母来识别,大部分是整个标题通常更易读。一些“热门”新闻在板凳上等待着,以便在最后一分钟进行修正,(晚报)在最后一次组装和最终印刷之前。

                姜戈从堪萨斯州劳伦斯杂志的办公室出来。可能一些印刷术语仍然存在。 来自法国的 A-django-modal-&-friendly-old-slug-boy-。

                【讨论】:

                  【解决方案10】:

                  还可以在 django-admin 上进行自动 slug。在 ModelAdmin 中添加:

                  prepopulated_fields = {'slug': ('title', )}
                  

                  在这里:

                  class ArticleAdmin(admin.ModelAdmin):
                      list_display = ('title', 'slug')
                      search_fields = ('content', )
                  
                      prepopulated_fields = {'slug': ('title', )}
                  

                  【讨论】:

                    【解决方案11】:

                    它是 URL 的描述性部分,用于使其更具人性化描述性,但 Web 服务器不一定需要 - 在 What is a "slug" in Django? 中,slug 是 'in-django-what-is-a-slug' ,但 slug 不用于确定page served(至少在此站点上)

                    【讨论】:

                      【解决方案12】:

                      来自here

                      “蛞蝓”是一个报纸术语,但什么 这意味着这是最后一点 网址。例如,一个带有 标题,“A bit about Django”会 变成,“有点关于 django” 自动(当然,您可以 如果您不喜欢 自动生成的 slug)。

                      【讨论】:

                        猜你喜欢
                        • 2018-04-22
                        • 2011-05-20
                        相关资源
                        最近更新 更多