URL配置:
url(r'^body/(?P<id>\d+)/$', 'body_part_detail', name='body-part-detail'),
url(r'^body/(?P<id>\d+)/(?P<slug>[-\w\d]+)/$', 'body_part_detail', name='body-part-detail'),
get_absolute_url()
实施:
def get_absolute_url(self):
kwargs = {
'id' : self.id,
'slug' : slugify(self.name)
}
return reverse('body-part-detail', kwargs=kwargs)
现在,我有两个url
s name=body-part-detail
(这可能是错的?)。尽管如此,reverse
成功的意义在于它使用第二个url
并使用slug组件返回所需的URL。为什么这样做?在这种情况下,我只是“幸运”(引用因为程序不应该是幸运的!)?
最后,在SO和Web上有几个地方,人们通过url
分享name
关键字arg的URLConfs示例。例如,Visgean Skeloru的答案在这里:Optional get parameters in django?。这是错的/坏的吗?
答案 0 :(得分:4)
reverse
功能确定您拥有kwargs id
和slug
以及模式名称body-part-detail
,并返回与这些kwargs对应的唯一网址那个名字。你不幸运,这就是reverse
的目的。
您可以为多种模式使用相同的名称,但我认为这不是设计工作的方式(我可以看到一个非常古老的错误提示,建议implementing a check以确保没有任何重复)。我怀疑如果为每个模式使用唯一名称,您的应用程序将更容易维护。请查看docs了解更多信息。
答案 1 :(得分:3)
在你的reverse()
电话中,你传递了两个论点。所以Django发现它无法将它与第一个URL匹配,因为虽然名称是正确的,但该URL只有一个URL参数。所以Django必须将它与第二个URL匹配。
可选的URL模式是可以的,但最好为每个URL指定一个唯一的名称,并使用它来反转URL。这样可以消除解析URL时的任何歧义,并且还可以让您自己和其他开发人员更容易理解代码。