您需要通過一個唯一的標識符來識別帖子。這可以是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