【问题标题】:Django Template inheritance: how many levels and what page to renderDjango模板继承:渲染多少层和什么页面
【发布时间】:2013-05-29 18:59:45
【问题描述】:

我想对构建 django 模板级别有一些建议。

阅读文档,我不明白如何创建超过 2 级的模板层次结构。

例如,我想创建 3 级继承:

base.html
    └── base_level2.html
            ├── level2_level3_1.html
            └── level2_level3_2.html

这是我的代码:

  • base.html

    First level
    {% block level2 %}{% endblock %}
    
  • base_level2.html

    {% extends "base.html" %}
    {% block level2 %}
        Second level
        {% block level3_1 %}{% endblock %}
        {% block level3_2 %}{% endblock %}
    {% endblock %}
    
  • level2_level3_1.html

    {% extends "base_level2.html" %}
    {% block level3_1 %}
        Third level, part 1
    {% endblock %}
    
  • level2_level3_2.html

    {% extends "base_level2.html" %}
    {% block level3_2 %}
        Third level, part 2
    {% endblock %}
    
  • views.py:

    def myView(request):
        return render_to_response('level2_level3_1.html', {}, context_instance=RequestContext(request))
    

这样我可以在浏览器上看到以下内容:

First level
Second level
Third level, part 1

这对我来说是合乎逻辑的,因为我只在 level2_level3_1.html 上调用 render_to response

当然,如果调用 level2_level3_2.html,我会收到消息 Third level, part 2,但不会收到 Third level, part1

如何解决这个问题?这是一个好方法吗?我以这种方式构建了东西,因为我的真实模板非常大,有很多代码行,所以我想保持一些秩序。 任何建议将不胜感激。

【问题讨论】:

  • 有什么问题?你想拥有Third level, part 1Third level, part 2。为什么不能将两个部分放在同一页面中?它们属于两个不同的块。
  • 正如我上面所说的“我以这种方式构造东西,因为我的真实模板非常大......”。这是一个最小的示例,但我的 level2_level3_1.html 和 level2_level3_2.html 实际上很长,我不想将它们合并到一个巨大的单个文件中。

标签: django inheritance django-templates


【解决方案1】:

在不了解模板的具体功能的情况下,很难说这是一个好主意还是坏主意,但我的直接反应是您试图过度组织模板。我认为大多数人会敦促您远离 3 层以上的系统,因为这使得在网站中进行小的更改变得更加困难,并且更难以跟踪事物的位置。来自 Python 之禅:

平面优于嵌套

Two Scoops of Django 中对 3 层系统的建议如下:

  1. 每个应用程序都有一个base_<app_name>.html 模板。应用级基础模板共享一个共同的父级 base.html。
  2. 应用内的模板共享一个共同的父 base_<app_name>.html 模板。
  3. 任何与base.html同级的模板都继承base.html

对于您的命名架构,它可能如下所示:

  | Templates/
  |--base.html
  |--someothertemplate.html # extends base.html
  |--level2/
  |----base_level2.html     # extends base.html
  |----level2_1.html        # extends base_level2.html
  |----level2_2.html        # extends base_level3.html

编辑:并没有真正的原因:

    Second level
   {% block level3_1 %}{% endblock %}
   {% block level3_2 %}{% endblock %}

其中每个块引用一个模板的内容。您可以将其简化为一个块,例如

{% block level3 %}{% endblock level3%}

然后在每个 level3 模板中,相应地重命名块

【讨论】:

  • 好吧,那么即使是几千行,也没有split level3的办法?
  • 你能解释一下你所说的“分层”是什么意思吗?这些级别是否显示在同一页面上?而您只是想切碎您的页面,以便更易于管理?如果您的模板长达数千行,那么您可能做错了什么。您应该编写为您生成 html 的代码。
  • 这不是“拆分级别”,而是如何拆分.........level3。是的,这些级别显示在同一页面上,如示例中所述。是的,我想切掉我的页面,以便于管理。我的模板长达数千行,因为它非常庞大和复杂,而不是因为我不使用 Django 工具、模板标签等......
【解决方案2】:

可能不是最好的方法,但您可能会使用 include https://docs.djangoproject.com/en/dev/ref/templates/builtins/#include

base_level2.html 是这样的

{% extends "base.html" %}
{% block level2 %}
Second level
{% include "level2_level3_1.html" %}   
{% include "level2_level3_2.html" %} 
{% endblock %}

我没有测试过这个,所以不确定它是否有效。

顺便说一句:

include 标签应该被认为是“渲染这个子模板并包含 HTML”的实现,而不是“解析这个子模板并包含它的内容,就好像它是父模板的一部分一样”。这意味着包含的模板之间没有共享状态——每个包含都是一个完全独立的渲染过程。

【讨论】:

  • 是的,就是那个子句我没有使用include标签。
  • 但它应该做你需要的,你甚至可以传递参数。
猜你喜欢
  • 2013-01-09
  • 2018-05-20
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多