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

时间:2013-03-15 13:43:43

标签: django django-templates django-views

在Django v1.4.3下

为什么下面的Django模板案例1中的if语句总是显示块语句的内容,而与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语句的内容始终显示在浏览器中,与是否提供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(如果提供map_url,则将if语句嵌套在block语句中仅在浏览器中显示block语句的内容。):

{% 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 %}

1 个答案:

答案 0 :(得分:4)

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

基本上,在最初加载模板时(渲染之前)会评估块标记,以便Django可以查找继承链并构建最终的模板对象。这意味着其他标记内的块(如“if”)将无法按预期方式工作,因为一旦真正的模板渲染开始,块标记就不再存在。