【问题标题】:Django: Managing urls like id:slug with duplicated slugDjango:使用重复的 slug 管理诸如 id:slug 之类的 url
【发布时间】: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

标签: django url django-urls slug


【解决方案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"),
    

    一切正常!

    【讨论】:

      猜你喜欢
      • 2014-12-08
      • 1970-01-01
      • 2014-03-24
      • 2020-09-18
      • 2010-12-11
      • 2017-05-25
      • 2020-11-24
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多