让我们说我有一个包含三个应用程序的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原则。我还缺少其他一些解决方案吗?
答案 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。