将基于唯一ID的slugyfied字段附加到Django中的URL

时间:2011-07-16 18:20:42

标签: django url url-rewriting django-urls

有人输入www.example.com/3/

我有一个带有charfield的模型,我可以进行击打。

class Mymodel(models.Model):
    title = models.CharField(max_length=200)

如何在Django中将URL重写为www.example.com/3/title-of-selected-id

我是在urls.py还是在views.py中进行的?我能想到的就是制作这样的2种模式

(r'^mymodels/(?P<mymodel_id>\d+)/(?P<name_slug>[\w-]+)$', 'app.views.detail'),
(r'^mymodels/(?P<mymodel_id>\d+)/$', 'app.views.rewrite'),

然后在我的app.views.rewrite中,我会获得mymodel标题,将其重新标记并重定向到第一个网址。但这看起来非常糟糕

1 个答案:

答案 0 :(得分:0)

通过#django irc,有人告诉我,重定向方法并不差,我们想不出另一种简单的方法,所以我只是编写了一些看起来有用的东西。

#urls.py
(r'^mymodels/(?P<mymodel_id>\d+)/$', 'app.views.detail'),
(r'^mymodels/(?P<mymodel_id>\d+)/(?P<name_slug>[\w-]+)/$', 'app.views.detail'),

#views.py
def detail(request, mymodel_id, name_slug=None):
    mymodel = get_object_or_404(Mymodel, pk=mymodel_id)

    slug = slugify(mymodel.title)

    if slug == name_slug:
        return HttpResponse("model number %s." % mymodel_id)
    else:
        return redirect(reverse('app.views.detail', args=[mymodel_id, slug]), permanent=True)