2017-02-23 76 views
0

我正在开发一个类似应用程序的博客,其中有相似或有时标题相同的帖子。用户也可以随时编辑帖子的标题。 目前我的url看起来像这样。我应该在django网址中使用slug字段吗?

<a href="{% url 'myapp:read' post.id %}">{{post.title}} </a> 

现在我读过几个答案,其中有id沿着他们通过slug太喜欢这个问题的url。 即使idurl将是唯一的,对吧?那为什么slug?如果是用于人性化url那么应该存储它呢? 所以总结:

  1. 如果id是独一无二的,那么为什么slug
  2. 如果它的重要那么我们应该存储它吗?
  3. 如果和有什么关系请详细说明canonical links &的工作方式slug怎么可以帮到它?或者至少指引我来源。

参考: when to store slugfield in database in django?answer

+1

Slug只是让你快速了解这个URL的含义。因为这个问题的网址可能是http://stackoverflow.com/questions/42407755/does-it-work,它仍然重定向到相同的职位。但说了这也取决于实施。在这种情况下,Stack Overflow可能会检查与帖子ID对应的有效slu and,如果未找到,则重定向到原始slu块。 – AKS

+0

@AKS,您的评论应该成为这个问题的答案 – Marat

回答

0
  1. 如果ID是唯一的,那么为什么塞?

弹头只是一个让你迅速得到什么这个URL是大约感的方式 - 这不仅是通过使用id保证它的可读性。

  1. 如果它的重要那么我们应该存储它吗?

URL这个问题可能是Should I use slug field too in django URLs?仍然重定向到同一个岗位。但说了这也取决于实施。在这种情况下,Stack Overflow可能会检查与帖子ID对应的有效slu and,如果未找到,则重定向到原始slu块。

我只是改变了问题的标题和结果的URL也改变了:

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 

所以,如果你存储蛞蝓,你需要确保它是更新每次标题被改变。

  • 如果它有什么用做请详细规范链接&的工作蛞蝓如何帮助呢?
  • Canonical链接被搜索引擎用来标识导致相同内容的重复URL。您可以查看到这个职位的源代码,你可以找到以下的HEAD规范链接:当你搜索一些关键字此URL匹配

    <link rel="canonical" href="http://stackoverflow.com/questions/42407755/should-i-use-slug-field-too-in-django-urls"> 
    

    搜索引擎将收集这些网址,并将其返还给您。搜索引擎对网页进行排名的一个因素是URL中的关键字。一个好的slug可以帮助搜索引擎根据URL中匹配的关键字返回用户最好的结果。

    +0

    感谢您的答案..!所以如果我说,我会在网址中使用它们,但不会将它们存储在任何地方,搜索引擎仍然可以利用它们,这是否正确? – Niraj

    +0

    是的,这是真的! – AKS

    +0

    谢谢先生..!这一直在窃听我好几天..! :) – Niraj

    0

    您需要通过一个唯一的标识符来识别帖子。这可以是ID或者slu。。使用两者都是毫无意义的,并且容易出错。您可以在标题中包含一个slug和一个id,在这种情况下,您应该忽略完全在URL中传递的slug并使用该ID。

    可以忽略蛞蝓,只是用这样的ID:

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

    如果你这样做,你并不需要保存塞所有,只是从标题每次使用它生成它。

    就我个人而言,我更喜欢slu because,因为它们提供了与Django良好集成的更友好的URL。例如使用基于类的视图,你可以创建一个类似如下的URL:

    url(r'^(?P<slug>[\w-]+)/$', BlogView.as_view(), name='blog-view') 
    

    而且你的类基础观点是超级干净:

    class BlogView(DetailView): 
        model=BlogEntry 
    

    这就是它! Django自动地知道通过slug来查看模型,并假设你的模板正确命名,你不需要连接其他任何东西(好吧,你可能会这样做)。 github上有关于此设置的真实helpful gist

    如果您想要使用slug,请在保存记录时生成它,并在碰撞发生时使用某种自动变形来使其变为唯一(或让用户手动覆盖它)。在我的一个博客中,我将日期嵌入到slug中以使其更加独特,然后使用递归函数来确保它是唯一的。 (here's an little tutorial someone made on making unique slugs)。包含一些手动替代slu is也是一个好主意。

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

    def autoslug(self, slug, attempt=1): 
        if MyModel.objects.filter(slug=slug).exists(): 
         return autoslug(slug[:47]+"%d" % attempt, attempt + 1) 
        else: 
         return slug 
    

    您在模型存储蛞蝓创建蛞蝓场。例如,基于类的视图可以传递一个slu and,它会神奇地找出你想要的。 Django拥有多种内部工具,通过该名称引用它,所以简单起见,并使用django所期望的相同名称。

    此外,给定资源的URL应该不变,因此链接是持久的。当您更改标题时更改slug意味着资源的URL发生更改,IMO对同一资源具有更改的URL总是一个坏主意。这对搜索引擎优化并不好,对任何将外部资源链接起来的人都不好。

    +0

    感谢您解释..!根据你的最后一段,如果我实现'slug'和'id'的方式实现了stackoverflow(即改变'url'中的'slug'不会改变结果资源),它会影响SEO吗?我的意思是我只考虑'id','slug'只是为了可读性。 – Niraj

    +0

    如果slug是URL的一部分,并且它发生了变化,它可能会影响SEO。 –

    +0

    谢谢你帮助我理解丹尼斯的各种事情..! – Niraj