为什么这个URLConf / reverse()组合与重复的命名url条目一起工作?这样做的正确方法是什么?

时间:2013-02-05 19:22:45

标签: python django django-urls

  • 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?。这是错的/坏的吗?

2 个答案:

答案 0 :(得分:4)

reverse功能确定您拥有kwargs idslug以及模式名称body-part-detail,并返回与这些kwargs对应的唯一网址那个名字。你不幸运,这就是reverse的目的。

您可以为多种模式使用相同的名称,但我认为这不是设计工作的方式(我可以看到一个非常古老的错误提示,建议implementing a check以确保没有任何重复)。我怀疑如果为每个模式使用唯一名称,您的应用程序将更容易维护。请查看docs了解更多信息。

答案 1 :(得分:3)

在你的reverse()电话中,你传递了两个论点。所以Django发现它无法将它与第一个URL匹配,因为虽然名称是正确的,但该URL只有一个URL参数。所以Django必须将它与第二个URL匹配。

可选的URL模式是可以的,但最好为每个URL指定一个唯一的名称,并使用它来反转URL。这样可以消除解析URL时的任何歧义,并且还可以让您自己和其他开发人员更容易理解代码。