【问题标题】:Finding the sum of numbers in jinja2 template using flask使用烧瓶查找jinja2模板中的数字总和
【发布时间】:2017-06-07 04:13:50
【问题描述】:

我正在学习烧瓶并尝试创建一个接受学生姓名和分数的网络应用程序,查找所有分数的总和并在表格中显示内容。但是总数总是显示为0

代码如下

mark_total.py:

from flask import Flask, render_template, request

app = Flask (__name__)

@app.route('/')
def student():
        return render_template('student.html')

@app.route('/result', methods = ['POST', 'GET'])
def result():
        if request.method == 'POST':
                result = request.form
                return render_template('result.html', result = result)

if __name__ == '__main__':
        app.run(host = '0.0.0.0', debug = True)

学生.html:

        <form action = "/result" method = "POST">
                <p>Name <input type = "text" name = "Name" /></p>
                <p>Physics <input type = "text" name = "Physics" /></p>
                <p>Chemistry <input type = "text" name = "chemistry" /></p>
                <p>Maths <input type ="text" name = "Mathematics" /></p>
                <p><input type = "submit" value = "submit" /></p>
        </form>

</body>
</html>

结果.html:

<html>
        <head>
                <title>Results</title>
        </head>

        <body>
                <h1>{{result["Name"]}}'s results</h1>
                {% set total = 0 %}
                <table border = 1>
                {% for key, val in result.iteritems() %}
                        {% if key != 'Name' %}
                                {% set total = total|int + val|int %}
                                <tr>
                                        <td>{{ key }}</td>
                                        <td>{{ val }}</td>
                                        <td>{{ total }}</td>
                                </tr>
                        {% endif %}
                {% endfor %}
                <tr>
                        <td>Total</td>
                        <td>{{total}}</td>
                </tr>
                </table>
        </body>
</html>

输出的html源代码如下:

<html>
	<head>
		<title>Results</title>
	</head>
	<body>
		<h1>ABC's results</h1>
		<table border = 1>
			<tr>
				<td>Mathematics</td>
				<td>100</td>
				<td>100</td>
			</tr>
			<tr>
				<td>chemistry</td>
				<td>100</td>
				<td>100</td>
			</tr>
			<tr>
				<td>Physics</td>
				<td>100</td>
				<td>100</td>
			</tr>
			<tr>
				<td>Total</td>
				<td>0</td>
			</tr>
		</table>
	</body>
</html>

有人可以帮我理解如何解决这个问题吗?

【问题讨论】:

  • 真的要在模板里做计算吗?为什么不在mark_total.py 中计算这个并将结果传递给模板?
  • 是的。我尝试在 python 中进行更改并且它有效。我想用模板试试。

标签: python python-2.7 flask jinja2


【解决方案1】:

问题是循环内定义的total 与循环外定义(和访问)的total 不同。这就是本地作用域的作用。

您可以通过使用这样的 hack 来克服这个问题(改编自 this 答案)。

<html>
        <head>
                <title>Results</title>
        </head>

        <body>
                <h1>{{result["Name"]}}'s results</h1>
                {% set total = [0] %}
                <table border = 1>
                {% for key, val in result.iteritems() %}
                        {% if key != 'Name' %}
                                {% set _ = total.append(total.pop() + val|int) %}
                                <tr>
                                        <td>{{ key }}</td>
                                        <td>{{ val }}</td>
                                        <td>{{ total[0] }}</td>
                                </tr>
                        {% endif %}
                {% endfor %}
                <tr>
                        <td>Total</td>
                        <td>{{ total[0] }}</td>
                </tr>
                </table>
        </body>
</html>

但我真的不确定在模板中做这些事情是否是个好主意。模板的主要思想是将逻辑(如计算总数)和表示分离,这违反了这个原则。

【讨论】:

  • 感谢 Ilya 不仅回答了这个问题,还提出了正确的方法。
【解决方案2】:

当您在循环内更改变量值时,除了字典外不会影响循环外:

{% set total = {'value': 0} %}
...
    {% if total.update({"value": c|int + total.value|int }) %} {% endif %}
...
    {{total.value}}

【讨论】:

  • 不仅仅是一个字典。实际上,任何可变对象都可以工作。
猜你喜欢
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 2019-05-25
  • 1970-01-01
相关资源
最近更新 更多