Django:如何在我的项目urlconf中覆盖app提供的url?

Chr*_*son 20 django code-reuse django-urls

假设我有一个包含三个应用程序的Django项目:foo,bar和glue.我正在尝试遵循可重用的应用程序约定,因此foo和bar不依赖于(并且不知道任何关于)彼此或胶水.Glue包含将其他两个应用程序集成到站点中的代码.

Foo提供了一个模板标签,我希望将其包含在bar提供的其中一个页面中.条形图页面的视图可以传递给备用模板.我在胶水中制作了一个扩展条形模板的模板,并包含了foo的模板标签.为了将我的新模板传递到bar的视图,我需要修改指向它的urlconf条目.

我的项目urlconf看起来像这样:

urlpatterns = patterns('',
  (r'^$', include('glue.urls')),
  (r'^foo/', include('foo.urls')),
  (r'^bar/', include('bar.urls')),
)
Run Code Online (Sandbox Code Playgroud)

将备用模板(或任何其他任意视图参数)传递给条形视图的最优雅方法是什么?我不想直接修改bar的urlconf,因为这会使它依赖于胶水.

我能想到的唯一另一种方法是删除include('bar.urls'),将bar的urlconf中的url模式复制到项目urlconf中,并修改我感兴趣的模式.但这种方法违反了DRY原则.还有其他一些我缺少的解决方案吗?

Chr*_*son 28

在urlconf中显然允许重复的URL,并且列出的第一个匹配将具有优先级:

urlpatterns = patterns('',
  (r'^$', include('glue.urls')),
  (r'^foo/', include('foo.urls')),

  # This will override the same URL in bar's urlconf:
  (r'^bar/stuff/$', 'glue.views.new_bar_stuff', {'arg': 'yarrgh'}, 'bar_stuff'),

  (r'^bar/', include('bar.urls')),
)
Run Code Online (Sandbox Code Playgroud)