Django:使用重复的 slug 管理诸如 id:slug 之类的 url

Posted

技术标签:

【中文标题】Django:使用重复的 slug 管理诸如 id:slug 之类的 url【英文标题】:Django: Managing urls like id:slug with duplicated slug 【发布时间】:2013-03-27 20:40:39 【问题描述】:

使用 Django 1.5 我将 slug 存储在 DB 中

我的网址配置如下:

url(r'^(?P<id>[0-9]+):(?P<slug>[-\w]+)$', TracksDetailView.as_view(), name="track-view"),

在我的 Podel 中,我有:

@models.permalink
def get_absolute_url(self):
    return ('track-view', [str(self.id), str(self.slug)])

如果 2 个 slug 相同,我会收到以下错误:

get() returned more than one GPXTrack -- it returned 2! Lookup parameters were 

我使用通用视图(DetailView)来渲染页面:

class TracksDetailView(DetailView):
    model = GPXTrack
    context_object_name = 'track'

知道如何避免这种情况不需要独特的蛞蝓

【问题讨论】:

问题似乎不是 URL,而是获取 GPXTrack 的代码(并返回错误)。也许你最好表明这一点。 谢谢丹尼尔,我只是更新提供代码的问题 好吧,假设我是id = 1523 的用户,我创建了两个tracks(不管是什么),假设我同时命名了monkeyTrack,你的应用程序怎么知道我是哪一个?如果我访问yourApp.com/1/monkeyTrack,如果你想避免这个错误,你需要有唯一的 slug 或以某种方式限制用户! 鉴于 id 是唯一的,我通过 id 而不是 slug 检索曲目:id 指的是曲目 id 而不是用户 id 【参考方案1】:

您将不得不覆盖视图的get_object 方法。您继承的没有考虑到您正在使用 ID 和 slug。它假设您传递的是 pk 或 slug - 并且还假设它们是独一无二的。

【讨论】:

【参考方案2】:

诀窍很简单,但感谢您为我指明了正确的方向!

好吧,get_object 方法会寻找带有键 'pk' 而不是 'id' 的 kwargs,因此我将网址更改为:

url(r'^(?P<pk>[0-9]+):(?P<slug>[-\w]+)$', TracksDetailView.as_view(), name="track-view"),

一切正常!

【讨论】:

以上是关于Django:使用重复的 slug 管理诸如 id:slug 之类的 url的主要内容,如果未能解决你的问题,请参考以下文章

Django 空请求对象

在带有 json api 的 django rest 框架中使用 slug 而不是 ID

使用 slug 而不是 ID 获取记录

Django 如何将 slug 表示为基于函数的视图的 ID

在 URL 中同时显示 slug 和 ID,但仅在 Django 中按 ID 路由

如何让 Django slug 和 id 一起工作?