【问题标题】:How to override Django view that has a namespaced url pattern?如何覆盖具有命名空间 url 模式的 Django 视图?
【发布时间】:2015-12-20 12:15:25
【问题描述】:

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

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

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

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

这对于可重复使用的应用程序显然非常有用,但我很难找到在我的项目中覆盖此视图的方法。有没有办法这样做,而不重写对reverse() 的所有调用以及foo{% url %} 的使用?这基本上相当于分叉了应用程序,并首先破坏了重用视图的目的。

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多