当我读到django代码时,我经常在模型中看到所谓的"slug"。我不太确定这是什么,但我知道它与URL有关。这个鼻涕虫是什么时候用的?
(我已经阅读了本术语表中的定义。)
这是一种生成有效URL的方法,通常使用已经获得的数据。例如,使用文章标题生成URL。我建议使用一个函数生成slug,给它一个标题(或其他数据块),而不是手动设置。
一个例子:
The 46 Year Old Virgin
A silly comedy movie
the-46-year-old-virgin
现在假设我们有一个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。所有字母都是小写,空格由连字符-替换。看看这个网页的网址就可以了!
很好的描述,但需要补充的是:slugfield不能保证框外的唯一性,所以如果默认使用它,这是一个更好的URL:www.example.com/article/the-40-year-virgin/23/,其中"23"是article.id,并且实际上是用来执行查询的(也比在slug上查询快)。
我发现www.example.com/article/23/the-40岁的Virgin更容易阅读。
您还可以向slug添加一个唯一的约束。
如果您基于ID提供内容,那么决定是检查slug是否与内容匹配(如果不匹配则返回404),还是完全忽略它。我不认为有什么是最好的,搜索引擎优化的一般规则。因此,如果在浏览器中输入stackoverflow.com/questions/427102/…,仍将显示此页面。
@Daniel记住,一个slug还隐藏了真正的数据库ID,因此您的示例破坏了使用slug的一个优势。
@eno真的不需要隐藏数据库ID——假设所有的URL都是公开的。
@乔希是的/article/4358639485639比article/title.html更适合SEO。
@eno为seo和permalink nicey添加了slug。ID用于索引查找。StackOverflow的SEO非常出色——他们使用的正是这个策略。你的论点是"隐藏数据库ID",现在你已经把它变成了"seo"。发生什么事了?
我是通过一个鼻涕虫来阅读这个网页的!
因此,如果我们使用slug(如数据库或"数据库管理")存储主题名称,我们应该只根据slug列而不是name列进行索引和搜索吗?
定义slug的很好例子
如果我能提供一些历史背景:
术语"slug"与铸造金属铅有关,在这种情况下,印刷字体是由铸造金属铅制成的。每一张纸都有自己的字体工厂定期重新融化和重新铸造在新的模具,因为在许多印刷后,他们变得磨损。像我这样的学徒在那里开始了他们的职业生涯,一直走到了顶峰(不再是了)。
排字机必须以向后的方式编写文章的文本,并将前导字符按一定的顺序堆叠起来。所以在印刷的时候,字母会直接印在纸上。所有的打字员都能像印刷版一样快速地阅读报纸。因此,鼻涕虫(像蜗牛一样)和慢故事(最后一个固定下来的)都是坐在长凳上等待着的,它们的第一个字母仅仅是识别出来的,大部分是整个标题,通常更容易阅读。一些"热门"新闻在台上等待,等待可能的最后一分钟修正(晚报),最后组装和最终印刷。
姜戈从堪萨斯州劳伦斯期刊的办公室里走出来。可能还有一些印刷术语。来自法国的A-Django-爱好者-友好的老鼻涕虫男孩。
谢谢你的词源!
作为一段历史,术语"鼻涕虫"来自于报纸编辑的世界。
它是生产过程中故事的非正式名称。随着这篇报道从《垮掉的记者》到《编辑》,再到《印刷机》,这就是它引用的名字,例如,"你修正了‘俄罗斯切断欧洲天然气’报道中的错误了吗?".
Django使用它作为URL的一部分来定位故事,一个例子是www.mysite.com/archives/russia-cuts-europe-gas。
从这里开始。
"Slug" is a newspaper term, but what
it means here is the final bit of the
URL. For example, a post with the
title,"A bit about Django" would
become,"bit-about-django"
automatically (you can, of course,
change it easily if you don’t like the
auto-generated slug).
"鼻涕虫"是一个报纸术语。slug是一个短标签,只包含字母、数字、下划线或连字符。它们通常用于URL(如django docs)。
Django中的slug字段用于为动态创建的网页存储和生成有效的URL。
就像您在堆栈溢出时添加此问题的方式一样,会生成一个动态页面,当您在地址栏中看到问题标题时,您将看到以"-"代替空格。这正是鼻涕虫的工作。
你输入的标题是这样的->什么是姜戈的"鼻涕虫"?
和;
将其存储到段塞中后,归档结果将其存储到what-is-a-slug-in-django(参见本页的url)
它是URL的一个描述性部分,可以使其更具人性化描述性,但不一定是Web服务器所要求的——在Django中什么是"slug"?slug是"in-django-what-is-a-slug",但slug不用于确定服务的页面(至少在本站点上)
塞是一个短的URL友好的特定内容的标签。它只包含字母,数字,或hyphens underscores。slugs是股票和保存的内容和它的使用作为URL的字符串。
slugfield塞可以创造的。
前:
class Article(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(max_length=100)
如果你想使用title为塞,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)
如果它是新的uniqueness,加unique=True在塞场。
从之前的实例,例如:
class Article(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(max_length=100, unique=True)
你是一个懒惰的这段过程吗?别担心,这个插件会帮助你的。 Django是autoslug
也自动弹头在Django管理。在ModelAdmin中添加:
prepopulated_fields = {'slug': ('title', )}
正如这里:
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'slug')
search_fields = ('content', )
prepopulated_fields = {'slug': ('title', )}
塞
标签和短的东西,只包含字母,数字,或hyphens underscores。他们是用在urls一般。例如,在典型的博客:输入的URL
博客www.djangoproject.com https:/ / / / / / / 12 Apr 2008春/ 最后一点(春季)位于塞。