Skip to main content
 首页 » 编程设计

python之如何覆盖具有命名空间 url 模式的 Django View

2025年05月04日29mate10pro

我正在使用名为 foo 的外部应用程序我最喜欢它,但我需要扩展一个名为 Bar 的特定 View 的功能.通常,我只是将扩展 View 放在 urls.py 中之前 include('foo.urls')并将其命名为相同的名称,以便解析器首先命中它:

urlpatterns = [ 
    ... 
    url(r'^foo/path_to_bar$', CustomBar.as_view(), name='bar'), 
    url(r'^foo/$', include('foo.urls')), 
    ... 
] 

问题是,foo到处都使用命名空间 url,所以有问题的 View 实际上是由 foo:bar 引用的和 include()上面的声明实际上应该是:

include('foo.urls', namespace='foo', app_name='foo') 

这对于可重用的应用程序来说显然很棒,但我很难找到在我的项目中覆盖此 View 的方法。有什么办法可以做到这一点,而无需重写对 reverse() 的所有调用和 {% url %} 的用途在 foo ?这实际上相当于 fork 应用程序,并首先破坏了重用 View 的目的。

请您参考如下方法:

我不确定我是否理解这个问题。 {% url 'foo:foo' %} 将匹配应用程序中的 url 模式,并返回 /foo/path_to_bar/。然后该 URL 将与您的自定义 URL 模式匹配。您的自定义 View 的 URL 模式的名称无关紧要。

如果原始应用使用与 path_to_bar 不同的 URL,那将不起作用。在这种情况下,您仍然不必更改对 reverse 的所有调用 - 只需创建您自己的 my_foo_urls.py,复制 foo/urls 的内容。 py,并将其包含在内。