有没有办法在django模板中使用变量设置块的名称?

时间:2013-05-01 14:28:19

标签: python django django-templates

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

{% 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代码重命名块?

1 个答案:

答案 0 :(得分: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})

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