Django 中的“蛞蝓”是啥?

Posted

技术标签:

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

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

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

【问题讨论】:

若要立即了解,请查看您所在网站的 URL:https://***.com/questions/id/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://***.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)或完全忽略它。我不认为有什么是最好的,搜索引擎优化的一般规则。如果您在浏览器中输入***.com/questions/427102/…,SO 仍会显示此页面。 @Eno 确实不需要隐藏数据库 ID - 假设您的所有 URL 无论如何都是公开的。 @Eno 为 SEO 和永久链接 nicey-ness 添加了 slug。 ID 用于索引查找。 *** 的 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)。

【讨论】:

以上是关于Django 中的“蛞蝓”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的“蛞蝓”是啥?

Django 中的“蛞蝓”是啥?

Django 中的“蛞蝓”是啥?

Slug 字段不适用于 django 中的孟加拉语。如何在孟加拉语中使用蛞蝓

我如何让蛞蝓在 django 中工作

蛞蝓 Django 领域;我们需要这个吗? [复制]