2

我正在使用现有项目中的 Satchmo 安装。这个项目有它自己的模板以及一些已安装的各种应用程序的模板。其中一些特定于应用程序的模板有自己的 app_base.html 变体,这些变体期望从 base.html 派生。我希望能够对我的 Satchmo 模板做同样的事情,并将它们驻留在我的项目的基础中,但还可以在所有这些模板周围添加一些额外的 html。

  • /模板
    • base.html
    • 索引.html
    • /消息
      • news_base.html(扩展 base.html 并添加特定于新闻的模板功能)
      • 索引.html
      • 详细信息.html
    • /店铺
      • base.html(覆盖 Satchmo 的基础)

这种结构有些作用,但不是我所期望的。在 /store/base.html(Satchmo 的基础)中,我只是用测试消息替换了所有内容。我可以看到该消息,所以我知道 satchmo 正在加载其基础而不是站点的基础。但是,我不能再扩展我的项目的基础,因为使用:

{% extends "base.html %}

产生一个递归错误,因为它调用自己,下面的根本行不通。

{% extends "../base.html" %}

我意识到我可以将我的项目的 base.html 更改为稍微不同的名称,并将所有特定于应用程序的模板指向它们,但这似乎是对模板结构的这样一个基本方面的一个相当大的 hack。

4

3 回答 3

0

嗯,我不认为 django 相对那样查找模板。

有点疯狂的黑客,但这应该工作:

  • /templates/store/base.html延伸"global_base.html"
  • /templates/global_base.html延伸"base.html"
于 2009-03-12T01:15:23.470 回答
0

根据您设置模板结构的方式,使用 settings.TEMPLATE_LOADERS 变量可能也是一个好主意。

TEMPLATE_LOADERS 默认值:('django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source') 知道如何从各种来源导入模板的可调用元组(作为字符串)。请参阅 Django 模板语言:适用于 Python 程序员。

有关这如何影响模板加载过程的更多信息:http: //docs.djangoproject.com/en/dev/ref/templates/api/#loader-types

从您描述问题的方式来看,似乎通过注释掉“app_directories.load_template_source”文件行,您可能能够更好地找到一种方法来完成您正在做的事情。

django.template.loaders.app_directories.load_template_source 从文件系统上的 Django 应用程序加载模板。对于 INSTALLED_APPS 中的每个应用程序,加载程序都会查找模板子目录。如果该目录存在,Django 会在其中查找模板。

这意味着您可以将模板与您的个人应用程序一起存储。这也使得使用默认模板分发 Django 应用程序变得容易。

例如,对于此设置:

INSTALLED_APPS = ('myproject.polls', 'myproject.music') ...然后 get_template('foo.html') 将按以下顺序在这些目录中查找模板:

/path/to/myproject/polls/templates/foo.html /path/to/myproject/music/templates/foo.html 请注意,加载器在首次导入时会执行优化:它缓存了一个列表,其中包含 INSTALLED_APPS 包模板子目录。

默认情况下启用此加载程序。

于 2009-06-27T22:41:18.993 回答
0

我刚遇到同样的问题。看起来 satchmo 开发人员计划为此在商店模板目录中放置一个“空”基础。虽然这可能与您不再相关,但我希望在这里看到这一点。

您可以在模板目录中创建一个“shop”目录,然后将 main satchmo base.html 复制到该目录。

这对我有用。

于 2010-11-03T22:54:15.640 回答