python - 使用 flask 查找jinja2模板中的数字总和

标签 python python-2.7 flask jinja2

我正在学习 Flask 并尝试创建一个网络应用程序来接受学生的姓名和分数,找到所有分数的总和并在表格中显示内容。但总数始终显示为 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>

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

最佳答案

问题是您在循环内定义的 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>

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

关于python - 使用 flask 查找jinja2模板中的数字总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793024/

相关文章:

python - 为什么 datetime.time 没有时区?

python - 你怎么能得到 flask 中文件的文件路径?

docker - 如何在容器中与 docker 客户端正确交互

Python:不允许我引发异常。还有其他优雅的python方式吗?

python - Pandas .str.replace 和不区分大小写

列和行中的python pandas DataFrame子图

python - python 变量的 ruby​​ 风格条件设置

python - 如何在推送到 PyPi 之前测试 PyPi 安装是否有效? (Python)

python - 通过 USB/串口连接到 Python 中的 Newport CONEX-PP 运动 Controller

python - 如何让我的 HTML 按钮从 SQLite 数据库中删除正确的列表项?