13

我正在开发一个包含多个部分和小节的 Django 站点。我想要几个深度的模板继承:整个站点的基本模板,从根基本模板继承的每个部分的基本模板,等等。这是我想要的目录结构的简化版本:

base.html
section1/
  base.html
section2/
  base.html
section3/
  base.html

我希望所有文件section1/都包含类似的内容{% extends "base.html" %},这意味着它们将扩展section1/base.htmlsection1/base.html将包含类似 的内容{% extends "../base.html" %},这意味着它将扩展根级基本文件。但是,我在文档中找不到任何表明这是可能的内容,并且我无法让 Django 区分"../base.html""base.html"。({% extends "../base.html" %}抛出错误。)我想一种解决方法是重命名所有基本文件base_SECTIONNAME.html,并更新从它们继承的所有文件,但我担心随着我的网站变得更大并且部分更改名称等,这可能会变得难以维护. 我更喜欢利用目录和子目录指定的自然层次结构的解决方案。

有任何想法吗?

4

3 回答 3

20

可能是我监督了一些事情,但是您想要的一切都可以通过 django 模板系统来完成。所有扩展调用都相对于模板目录。

  1. 为了使子目录中的所有 base.html 文件扩展 base.html,您只需将 a{% extends "base.html" %}放入文件中。section1/base.html 看起来像这样。

    {% extends "base.html" %}

    {# ... rest of your code ...#}

  2. 现在,要从 section1 获取文件以扩展section1/base.html,您只需将其放在{% extends "section1/base.html" %}它们的顶部。第 2 节、第 3 节等也是如此。

就是这么简单,但在文档中可能并不完全明显。

我希望,我理解你的问题。

于 2009-03-22T18:07:15.557 回答
5

接受的答案会起作用,但我建议使用变量名来跟踪节结构。我个人的偏好是上下文处理器。例如,如果您网站的版块组织透明地反映在 url 中,请尝试以下操作:

# It may be convenient to make this function live in or near your url conf.
def convert_url_path_to_folder_path(path):
    # fill in the magic here

def sub_folder_available(request):
    folder = convert_url_path_to_folder_path(request.path)
    return {'subsection': folder, 'local_base':folder+'/base.html'}

然后在您的模板中,只需调用

{% extends local_base %}

可能有十几种其他方法可以做到这一点,但主要是考虑避免将文件夹名称硬编码到模板中。这将为您带来很多好处,特别是因为如果它们恰好足够相似,您可以在部分之间拖放模板。您可能会添加插入的另一件事是:

def sub_folder_available(request):
    folder = convert_url_path_to_folder_path(request.path)
    # Check if local base exists:
    if os.access(folder+'/base.html',os.F_OK):
        base = folder+'/base.html'
    else:
        # revert to your global base
        base = 'base.html'
    return {'subsection': folder, 'base':base}

这种策略的好处当然是你可以在完全没有任何本地基础模板的情况下启动并运行一个轻量级部分。

于 2009-03-23T05:00:58.450 回答
0

你可以使用这个库:https ://github.com/vb64/django.templates.relative.path

只需在您的模板中编写如下:

{% load relative_path %} {% 扩展 ".base.html" %}

这将扩展模板“base.html”,位于放置模板的同一文件夹中

{% load relative_path %} {% 扩展 "...base.html" %}

扩展模板“base.html”,位于高两层

同样的事情适用于“包含”标签。

于 2016-03-17T11:27:47.803 回答