Django模板继承: how many levels and what page to render

标签 django inheritance django-templates

我想在构建Django模板级别时获得一些建议。

阅读文档,我不了解如何创建具有两个以上级别的模板层次结构。

例如,我想创建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

    怎么解决呢?那是一个好方法吗?我以这种方式结构化了东西,因为我的真实模板很大,代码行很多,所以我想保持一些顺序。
    任何建议将被认真考虑。

    最佳答案

    在不了解模板的特定功能的情况下很难说这是一个好主意还是不好的主意,但是我的直接 react 是您正在尝试过度组织模板。我认为大多数人会敦促您不要使用三层系统,因为它会使在网站上进行小的更改变得更加困难,并且更难以跟踪事物的位置。从Python的Zen中:

    Flat is Better than Nested



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

    1. Each app has a base_<app_name>.html template. App-level base templates share a common parent, base.html.
    2. Templates within apps share a common parent base_<app_name>.html template.
    3. Any template at the same level as base.html inherits 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模板中,相应地重命名块

    关于Django模板继承: how many levels and what page to render,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16899917/

    相关文章:

    python - 如何满足 direct_to_template 的导入?

    javascript - {{csrf_token}} 给我 403 Forbidden 和 {%csrf_token%} 给我 500 服务器错误

    python - django,评论中不显示头像

    c++ - 从父类调用继承函数

    python - 每个答案都有多个分数类别的 Django 调查问卷

    django-templates - django 模板中的 url 模板标签

    python - 如何在 Django 中查看用户的 DetailView?

    django - 如何使用 django-filter 过滤 ManyToMany 字段

    c++ - 删除 C++ 继承中虚拟类成员的代码重复

    javascript - 如何在 JavaScript 中调用静态子类方法