0

我正在为我的项目制作一些通用模板,例如下面给出的消息模板。

{% extends base_name %}

{% block main-contents %}

    <h2>{{ message_heading }}</h2>

    <div class="alert alert-{{ box_color|default:"info" }}">
        {{ message }}

        {% if btn_1_text and btn_1_url %}
            <a href="{{ btn_1_url }}" class="btn btn-{{ btn_1_color }}">{{ btn_1_text }}</a>
        {% endif %}

        {% if btn_2_text and btn_2_url %}
            <a href="{{ btn_2_url }}" class="btn btn-{{ btn_2_color }}">{{ btn_2_text }}</a>
        {% endif %}

    </div>

{% endblock %}

我可以通过模板变量设置基本模板的名称。我的问题是是否有一种方法可以使用模板变量设置块的名称。通常我在几乎所有项目中都使用块名称 main-contents。但这并不是对所有项目都适用的。如果使用模板无法做到这一点,有没有办法使用 python 代码重命名块?

4

1 回答 1

1

我发现了一个黑客。不知道这个有没有后遗症。任何人都可以验证这一点吗?

def change_block_names(template, change_dict):
    """
    This function will rename the blocks in the template from the
    dictionary. The keys in th change dict will be replaced with
    the corresponding values. This will rename the blocks in the 
    extended templates only.
    """

    extend_nodes = template.nodelist.get_nodes_by_type(ExtendsNode)
    if len(extend_nodes) == 0:
        return

    extend_node = extend_nodes[0]
    blocks = extend_node.blocks
    for name, new_name in change_dict.items():
        if blocks.has_key(name):
            block_node = blocks[name]
            block_node.name = new_name
            blocks[new_name] = block_node
            del blocks[name]


tmpl_name = 'django-helpers/twitter-bootstrap/message.html'
tmpl1 = loader.get_template(tmpl_name)
change_block_names(tmpl1, {'main-contents': 'new-main-contents})

这似乎暂时有效。我想知道这种方法是否有任何后遗症或其他问题。

于 2013-05-01T16:36:05.470 回答