【问题标题】:Django: specifying a base template by directoryDjango:按目录指定基本模板
【发布时间】:2010-10-14 20:33:10
【问题描述】:

我正在开发一个包含多个部分和子部分的 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,并更新从它们继承的所有文件,但我担心随着我的网站变得更大,这可能会变得难以维护和部分更改名称等。我更喜欢利用目录和子目录指定的自然层次结构的解决方案。

有什么想法吗?

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

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

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

    {% 加载相对路径 %} {% 扩展“.base.html”%}

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

    {% 加载相对路径 %} {% 扩展“...base.html” %}

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

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

    【讨论】:

      【解决方案2】:

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

      1. 为了使子目录中的所有 base.html 文件都扩展 base.html,您只需将 {% extends "base.html" %} 放入文件中。 section1/base.html 应该是这样的。

        {% extends "base.html" %}

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

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

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

      希望,我理解你的问题。

      【讨论】:

      • 他们不能,因为您可以在不同的位置拥有模板。
      • 值得一提的是,所有文件夹(/root、/root/section1、/root/section2、...)都必须设置为 django TEMPLATE_DIRS,否则它不起作用。
      【解决方案3】:

      接受的答案会起作用,但我建议使用变量名来跟踪节结构。我个人的偏好是context processor。例如,如果您网站的版块组织透明地反映在 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}
      

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

      【讨论】:

      • 好帖子。我不确定,如果我失去更多,那么我会从这个解决方案中获益。我必须对此进行评估。
      • 显然是个案。只是暗示哪些额外的组织层可以发挥作用。
      猜你喜欢
      • 1970-01-01
      • 2018-01-01
      • 2013-01-21
      • 1970-01-01
      • 2019-01-02
      • 2021-09-09
      • 2014-09-02
      • 2010-12-01
      • 2012-07-18
      相关资源
      最近更新 更多