您需要通过一个唯一的标识符来识别帖子。这可以是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总是一个坏主意。这对搜索引擎优化并不好,对任何将外部资源链接起来的人都不好。
Slug只是让你快速了解这个URL的含义。因为这个问题的网址可能是http://stackoverflow.com/questions/42407755/does-it-work,它仍然重定向到相同的职位。但说了这也取决于实施。在这种情况下,Stack Overflow可能会检查与帖子ID对应的有效slu and,如果未找到,则重定向到原始slu块。 – AKS
@AKS,您的评论应该成为这个问题的答案 – Marat