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

时间:2012-02-16 05:42:36

标签: django django-urls code-reuse

让我们说我有一个包含三个应用程序的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')),
)

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

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

2 个答案:

答案 0 :(得分:26)

在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')),
)

答案 1 :(得分:2)

目前尚不清楚你在问什么,但据我了解,你的问题是:

  

将备用模板传递给视图的最佳方式是什么   在吧?

这与url conf无关,它只是将URL映射到方法。

django中的模板会从settings.py中TEMPLATE_DIRS的位置进行查找,最重要的是 django会在找到模板后停止查看

如果您的TEMPLATE_DIRS为空(默认情况下),则django会在任何已注册的应用(templates中列出的应用)内的INSTALLED_APPS目录中查找模板。

因此,要将备用模板传递给任何应用程序,只需在TEMPLATE_DIRS中列出的目录中创建一个具有相同名称(和目录结构)的文件。 Django将首先搜索它,并在找到匹配时停止。

这与覆盖默认管理模板的方式相同。

对于您的特定情况,假设您要将index.html的备用版本传递给应用bar

在项目路径的某处创建一个目录override_templates

在创建bar/templates/目录中,并将自定义的index.html添加到此目录,这样您就可以override_templates/bar/templates/index.html

override_templates中将TEMPLATE_DIRS的完整路径添加到settings.py

现在,django将首先在您的自定义目录中搜索所请求的任何模板,并将加载您的备用index.html。