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的主要内容,如果未能解决你的问题,请参考以下文章
在带有 json api 的 django rest 框架中使用 slug 而不是 ID
Django 如何将 slug 表示为基于函数的视图的 ID