在Django中,问题{{block.super}},如何避免在多个模板文件中复制`block`?

时间:2008-11-21 20:29:50

标签: django include django-templates

对于继承块的2个子模板文件,{{ block.super }}无法解析

Python 2.5.2,Django 1.0,Windows XP SP3

涉及文件的示例框架代码:

  1. base.html
  2. item_base.html
  3. show_info_for_all_items.html
  4. show_info_for_single_item.html
  5. 文件:base.html

    {% block content %}
    {% endblock %}
    

    文件:item_base.html

    {% extends "base.html" %}
    {% block item_info %}   
        Item : {{ item.name }}<br/>
        Price : {{ item.price }}<br/>   
    {% endblock %}
    

    文件:show_info_for_all_items.html

    {% extends "item_base.html" %}
    {% block content %}
        <h1>info on all items</h1>
        <hr/>
        {% for item in items %}
            {% block item_info %}
                {{ block.super }}
            {% endblock %}
            <hr/>
        {% endfor %}
    {% endblock %}
    

    文件:show_info_for_single_item.html

    {% extends "item_base.html" %}
    {% block content %}
        <h1>info on single item</h1>    
        {% block item_info %}
            {{ block.super }}
        {% endblock %}  
    {% endblock %}
    

    show_info_for_all_items.html会显示项目列表以及每个项目的信息。

    show_info_for_single_item.html显示包含商品信息的单个商品。

    show_info_for_all_items.htmlshow_info_for_single_item.html共享相同的代码以显示商品信息,因此我将其移至item_base.html进入block item_info

    {{ block.super }}show_info_for_all_items.html中的show_info_for_single_item.html不起作用。 {{ block.super }}解析为空白。

    如果我将代码从block item_info中的item_base.html移回show_info_for_all_items.htmlshow_info_for_single_item.html,那么它有效,但我必须在2中复制相同的block item_info代码文件。

    如果无法解决block.super问题,Django会提供类似INCLUDE =&gt;的内容吗? {% INCLUDE "item_base.html" %}因此可以包含模板文件中的块(而不是extends

    如何避免在两个html文件中重复block item_info

2 个答案:

答案 0 :(得分:4)

  

Django是否提供类似的功能   包括(...)

是的!,请查看文档:{​​{3}}

将公共代码块放在 foo.html 中,然后在每个模板中:

{% include 'foo.html' %}

答案 1 :(得分:2)

除了DZPM提到的include标记外,您可能还需要考虑编写custom inclusion tag

这种情况下的主要优点是调用模板不必使用与包含的模板相同的变量名称。您可以显示从名为“item”的变量以外的某个位置访问的项目:

{% show_item user.favorite_item %}