2
  • 网址配置:

    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)
    

现在,我有两个urls where name=body-part-detail(可能是错的?)。然而,reverse在它使用第二个url并使用 slug 组件返回所需 URL 的意义上,它是成功的。为什么这行得通?在这种情况下我只是“幸运”(引用因为程序不应该幸运!)?

最后,在 SO 和 Web 上有几个地方,人们给出了 URLConfs 的示例,其中urls 共享name关键字 arg。例如,Visgean Skeloru 在这里的回答:Optional get parameters in django? . 这是错误的/不好的吗?

4

2 回答 2

4

reverse函数识别您拥有 kwargsidslug模式名称body-part-detail,并返回与这些 kwargs 和该名称相对应的唯一 url。你不走运,这reverse就是设计要做的。

您可能可以为许多模式使用相同的名称,但我不认为这就是它的设计方式(我可以看到一个非常古老的错误票,建议实施检查以确保没有任何重复)。我怀疑如果您为每个模式使用唯一的名称,您的应用程序将更容易维护。查看文档以获取更多信息。

于 2013-02-05T19:51:34.863 回答
3

在您的reverse()通话中,您传递了两个参数。因此 Django 发现它无法将其与第一个 URL 匹配,因为尽管名称正确,但该 URL 只有一个 URL 参数。所以 Django 必须将它与第二个 URL 匹配。

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

于 2013-02-05T19:50:47.430 回答