Django模板继承:要渲染多少级别和页面

时间:2013-06-03 15:06:26

标签: django inheritance django-templates

我想在构建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

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

2 个答案:

答案 0 :(得分:7)

如果不知道模板的具体功能,很难说这是好主意还是不好主意,但我的反应是你试图过度整理你的模板。我认为大多数人会敦促你远离3层以上的系统,因为它使得在网站上进行小的更改变得更加困难,并且更难以跟踪事物的位置。来自Python的禅宗:

  

Flat比嵌套

更好

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

  
      
  1. 每个应用都有一个base_<app_name>.html模板。应用级基本模板共享一个公共父级base.html。
  2.   
  3. 应用内的模板共享一个共同的父基础_ <app_name>。html模板。
  4.   
  5. 与base.html处于同一级别的任何模板都会继承base.html
  6.   

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

  | 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模板中,相应地重命名块

答案 1 :(得分:3)

可能不是最好的方法,但您可以使用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 %}

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

和btw:

  

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