首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否也应该在django URL中使用弹格字段?

我是否也应该在django URL中使用弹格字段?
EN

Stack Overflow用户
提问于 2017-02-23 05:28:19
回答 2查看 1.4K关注 0票数 0

我正在开发一个类似于应用程序的博客,其中会有类似或有时相同标题的文章。此外,用户可以随时编辑他们的帖子标题。目前我的urls看起来是这样的。

代码语言:javascript
复制
<a href="{% url 'myapp:read' post.id %}">{{post.title}} </a>

现在,我读到的答案很少,与id一样,它们也通过了slug,就像这个问题的url。即使有了idurl也将是独一无二的,对吗?那为什么是slug?如果它是为了使url人性化,那么也应该存储它吗?因此,总结一下:

  1. 如果id是唯一的,那么为什么slug
  2. 如果重要的话,我们应该把它储存起来吗?
  3. 如果它与canonical-link有任何关系,请详细说明canonical links的工作& slug如何帮助它?或者至少让我找到消息来源。

参考: 什么时候在django的数据库中存储slugfield?和this 回答

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-23 06:12:38

  1. 如果id是唯一的,那为什么是鼻涕虫?

段塞只是让你快速了解这个网址的一种方式--它的可读性,这并不是仅通过使用id就能保证的。

  1. 如果重要的话,我们应该把它储存起来吗?

这个问题的网址可能是我是否也应该在django URL中使用弹格字段?,但它仍然重定向到同一个帖子。但话虽如此,它也取决于执行情况。在这种情况下,可能是堆栈溢出检查与post ID相对应的有效段塞,如果找不到,则重定向到原始段塞。

我只是更改了问题的标题,结果URL也发生了变化:

代码语言:javascript
复制
old => http://stackoverflow.com/questions/42407755/should-i-use-slug-field-too-in-django
new => http://stackoverflow.com/questions/42407755/should-i-use-slug-field-too-in-django-urls

因此,如果您存储的弹格,您需要确保它是更新的每次标题被改变。

  1. 如果它与canonical-link有任何关系,请详细说明规范链接的工作&段塞如何帮助它?

搜索引擎使用规范链接来识别导致相同内容的重复URL。YOu可以查看这篇文章的源代码,您可以在标题中找到以下规范链接:

代码语言:javascript
复制
<link rel="canonical" href="http://stackoverflow.com/questions/42407755/should-i-use-slug-field-too-in-django-urls">

搜索引擎将收集此URL,并在搜索与此URL匹配的关键字时将其返回给您。搜索引擎所依据的因素之一是匹配URL中的关键字。一个好的段塞可以帮助搜索引擎根据URL中匹配的关键字返回用户的最佳结果。

票数 1
EN

Stack Overflow用户

发布于 2017-02-23 06:32:58

您需要准确地通过一个唯一标识符来标识一个帖子。可以是身份证也可以是鼻涕虫。使用这两种方法都是没有意义的,而且容易出错。您可以在标题中同时包含一个弹格和一个ID,在这种情况下,您可能应该忽略URL中传递的段塞,并使用id。

您可以忽略这个段塞,只需像这样使用ID:

代码语言:javascript
复制
url(r'^(?:[\w-]+)/(?<id>\d+)/$', BlogView.as_view(), name='blog-view')

如果你这样做了,你根本不需要存储子弹,只要生成它的标题,每次你使用它。

就我个人而言,我更喜欢弹枪,因为它们提供了与Django很好地集成的更友好的URL。例如,使用基于类的视图,您可以创建如下所示的URL:

代码语言:javascript
复制
url(r'^(?P<slug>[\w-]+)/$', BlogView.as_view(), name='blog-view')

你的基于类的视图非常干净:

代码语言:javascript
复制
class BlogView(DetailView):
    model=BlogEntry

就这样!Django自动知道如何通过段塞查找模型,并假设您的模板命名正确,您不需要连接任何其他内容(好的,您可能会这样做)。关于这个设置,github上有一个真正的帮助要点

如果您想使用弹格,则在保存记录时生成它,并在发生冲突时使用某种自动损坏来使其惟一(或者让用户手动重写它)。在我的一个博客中,我将日期合并到弹格中,以使其更独特,然后使用递归函数来确保它的唯一性。(这里有一个关于制作独特的鼻涕虫的小教程)。这是一个好主意,包括一些方式手动过载的鼻涕虫也。

在上面的链接中,他使用了for循环,我个人更喜欢递归函数,如:

代码语言:javascript
复制
def autoslug(self, slug, attempt=1):
    if MyModel.objects.filter(slug=slug).exists():
        return autoslug(slug[:47]+"%d" % attempt, attempt + 1)
    else:
        return slug

您可以在模型上创建一个弹格字段来存储弹格。例如,基于类的视图可以传递一个段塞,它会神奇地确定您想要什么。Django's有各种各样的内部工具来引用它的名称,所以保持简单,并且使用django所期望的相同名称。

另外,给定资源的URL应该保持不变,因此链接是持久的。更改标题时更改段塞意味着资源更改的URL,IMO对于相同的资源更改URL总是一个坏主意。这对SEO有害,对任何将你的资源与外部链接在一起的人也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42407755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档