python - 为什么这个带有重复命名 url 条目的 URLConf/reverse() 组合有效?这样做的正确方法是什么?

标签 python django django-urls

  • URLConf:

    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,其中 name=body-part-detail(这可能是错误的?)。尽管如此,reverse 成功了,因为它使用第二个 url 并返回带有 slug 组件的所需 URL。为什么这行得通?在这种情况下我只是“幸运”吗(引用因为程序不应该幸运!)?

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

最佳答案

reverse 函数识别您拥有 kwargs idslug 以及模式名称 body-part-detail ,并返回对应于那些 kwargs 和那个名字的唯一 url。你不走运,这就是 reverse 设计的目的。

您可以为许多模式使用相同的名称,但我不认为它是如何设计的(我可以看到一个非常古老的错误票,建议 implementing a check 以确保没有任何重复).我怀疑如果您为每个模式使用唯一的名称,您的应用程序将更易于维护。看看 docs给我更多信息。

关于python - 为什么这个带有重复命名 url 条目的 URLConf/reverse() 组合有效?这样做的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715261/

相关文章:

python - 在 Django 中模拟 POST 请求

django - Django URL 中可变数量的字段

javascript - 如何使用 selenium webdriver 转储整个 dom 结构

python - 合并 pandas 中的 2 个数据框

python - Django websockets 实现

python - 创建word文档,然后将其附加到电子邮件Django

python - 如何在不实例化 Python 中的对象的情况下打印类属性?

mysql - 在 django admin 中修改条目会创建重复项

python - 使用全局包的 windows virtualenv

python - 在 Django 中,有没有办法使用 Flask 风格的路由语法来定义路由?