HTML模板文件中的if块无法使python flask变量对另一个变量可见,因为“ with”语句范围以if块

时间:2019-06-18 12:44:24

标签: python mongodb flask jinja2

Python Flask:在html模板文件中,如果“ with”语句作用域以if块结尾,则无法使python flask变量对另一个if块可见。试图将if块放置在for循环上方,但不会占用。

键:值列表具有以下内容: “ {主题:数学,UnitTest1-得分:90,UnitTest2-得分:95,UnitTest2-得分:98}” 想要将subject_name变量传递给第二个if语句 “如果键=='UnitTest3'” 有兴趣参考相应主题,然后更新数据库中的标记。由于变量是在第一个if语句“ if key =='Subject'%}中定义的(使用'with'语句)。尝试了不同的方式,但是上下文在第一个if块之后并没有前进。 试图在第四行“ if key”之后添加“ with subject_name =“”,以便如果“ if key =='Subject'”在第二行中可见,但是如果第二秒使用if,则会出现错误的主题名称“如果键=='主题'” 我相信jinja2支持这一点。任何帮助表示赞赏。

{% block content %}
{% for i in all_subjects %}
<article>
{%for key, value in i.items() %}
    {% if key %}    
        {% if key == 'Subject' %}

            {% with subject_name = value %}

            {% with subject = subject_db.find_one({'subject_name': subject_name}) %}
            {% if subject %}

                <div>
                    <a  href="#" >{{subject['subject_name']}}</a>
                </div>

            {% endif %}
            {% endwith %}
            {% endwith %}

        {% endif %}
        {% if key == 'UnitTest3' %}
            {% with marks = value  %}
            <form  action="" method='POST'>
                <div>
                    <label>  Marks: <input type="number" name="total_marks" min="0" value=0 oninput="this.value = Math.abs(this.value)"> </label>
                    <button type="submit">Update</button>

                </div>
            </form>
            {% endwith %}

        {% endif %}

    {% endif %}
{% endfor %}
</article>
{% endfor %}  
{% endblock content %}

1 个答案:

答案 0 :(得分:0)

您正在尝试在Jinja中做更适合python的事情。另外,您似乎正在传递包含2种不同对象的单个字典。这是令人困惑和不必要的。

您应该完全使用python处理和准备数据,然后将适当的对象/字典传递给Jinja进行显示。一个好的经验法则是,您应该避免从Jinja内部进行数据库调用。在Flask视图方法中解决这一问题。

我还要指出,key / value对将以不可预测的顺序从i中出来。而且您不能使用以None作为键值的字典项,因此可以删除{% if key %}支票。

数据结构正确之后,您将可以执行以下操作:

render_template('subjects.html', subjects=all_subjects, marks=all_marks)
{% block content %}
{% for s in subjects %}
    <article>
        <div class="subject">
            <a  href="#" >{{ subject.name }}</a>
        </div>
    </article>
{% endfor %}
{% for m in marks %}
    <article>
        <div>
            <form  action="" method='POST'>
                <label for="total_marks">Marks</label>
                <input type="number" id="total_marks" min="0" value="{{ m.value }}" oninput="this.value = Math.abs(this.value)">
                <button type="submit">Update</button>
            </form>
        </div>
    </article>
{% endfor %}
{% endblock content %}

最后一点:“ unit test”在软件中具有特殊含义,您应避免使用该术语来指代其他任何内容,因为这会使下一个继承您代码的人感到困惑。