嵌套{% block %}语句独立于{% if-statement %}的有效性运行



在Django v1.4.3下

为什么Django模板案例1中的if语句总是显示block语句的内容,而不管if语句是否为TRUE?

块语句总是在模板中的if语句之前执行吗?(也许我在文档中遗漏了这一点。)

View.py(注意,为了测试目的,map_url故意"不"提供):

def post_address(request):
    return render_to_response(
        'record/post_address.html',
        {'form': form},
        context_instance=RequestContext(request)
    )

base_integrated_form.html父模板包含

{% block after_form %}
{% endblock after_form %}

post_address.html(两种情况)Django模板案例1:(在if语句中嵌套block语句将导致block语句的内容始终显示在浏览器中,而不管是否提供了map_url。)

{% extends "base_integrated_form.html" %}
{% if map_url %}
   {% block after_form %}
   <div style="max-width:555px; height:240px; margin-left:auto; margin-right:auto;">
        <iframe id="map" width="100%" height="100%" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="{{ map_url }}" style="border: 0px solid black"></iframe>
    </div>
    {% endblock after_form %}
{% endif %}

Django模板案例2(在block-statement中嵌套if语句只会在提供map_url的情况下在浏览器中显示block-statement的内容):

{% extends "base_integrated_form.html" %}
{% block after_form %}
{% if map_url %}
   <div style="max-width:555px; height:240px; margin-left:auto; margin-right:auto;">
        <iframe id="map" width="100%" height="100%" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="{{ map_url }}" style="border: 0px solid black"></iframe>
    </div>
{% endif %}
{% endblock after_form %}

块标记不同于其他模板标记,它是模板继承系统的核心部分。

本质上,块标签是在模板初始加载时(在呈现之前)计算的,这样Django就可以查找继承链并构建最终的模板对象。这意味着在其他标签中的块(如'if')不会像你期望的那样工作,因为一旦真正的模板呈现开始,块标签就不再存在了。