[英]How can I simplify my code in Flask and html
我已经做 flask 和 python 大约 3 周了。
我正在尝试制作一个表格和表格,它采用两种货币和汇率并找到交换的双方。
即 CAD 到 US 和 US 到 CAD
这是我的 app.py 中的相关代码:
@app.route("/form", methods=["GET", "POST"])
def forms():
global reverse_exchange_rate, exchange_rate
form = CurrencyForm
if request.method == 'GET':
return render_template("form.html")
if request.method == 'POST' and form.validate_on_submit():
currency_1 = request.form['currency_1']
currency_2 = request.form['currency_2']
exchange_rate = float(request.form['exchange_rate'])
reverse_exchange_rate = 1 / exchange_rate
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
one = round(numbers.index(1) * exchange_rate, 3)
two = round(numbers.index(2) * exchange_rate, 3)
three = round(numbers.index(3) * exchange_rate, 3)
four = round(numbers.index(4) * exchange_rate, 3)
five = round(numbers.index(5) * exchange_rate, 3)
six = round(numbers.index(6) * exchange_rate, 3)
seven = round(numbers.index(7) * exchange_rate, 3)
eight = round(numbers.index(8) * exchange_rate, 3)
nine = round(numbers.index(9) * exchange_rate, 3)
ten = round(numbers.index(10) * exchange_rate, 3)
eleven = round(numbers.index(11) * exchange_rate, 3)
twelve = round(numbers.index(12) * exchange_rate, 3)
thirteen = round(numbers.index(13) * exchange_rate, 3)
fourteen = round(numbers.index(14) * exchange_rate, 3)
fifteen = round(numbers.index(15) * exchange_rate, 3)
sixteen = round(numbers.index(16) * exchange_rate, 3)
reverse_one = round(numbers.index(1) * reverse_exchange_rate, 3)
reverse_two = round(numbers.index(2) * reverse_exchange_rate, 3)
reverse_three = round(numbers.index(3) * reverse_exchange_rate, 3)
reverse_four = round(numbers.index(4) * reverse_exchange_rate, 3)
reverse_five = round(numbers.index(5) * reverse_exchange_rate, 3)
reverse_six = round(numbers.index(6) * reverse_exchange_rate, 3)
reverse_seven = round(numbers.index(7) * reverse_exchange_rate, 3)
reverse_eight = round(numbers.index(8) * reverse_exchange_rate, 3)
reverse_nine = round(numbers.index(9) * reverse_exchange_rate, 3)
reverse_ten = round(numbers.index(10) * reverse_exchange_rate, 3)
reverse_eleven = round(numbers.index(11) * reverse_exchange_rate, 3)
reverse_twelve = round(numbers.index(12) * reverse_exchange_rate, 3)
reverse_thirteen = round(numbers.index(13) * reverse_exchange_rate, 3)
reverse_fourteen = round(numbers.index(14) * reverse_exchange_rate, 3)
reverse_fifteen = round(numbers.index(15) * reverse_exchange_rate, 3)
reverse_sixteen = round(numbers.index(16) * reverse_exchange_rate, 3)
return render_template("table.html", form=form, currency_1=currency_1,currency_2=currency_2, exchange_rate=exchange_rate, numbers=numbers, one=one, two=two,three=three,four=four,five=five,six=six,seven=seven,eight=eight,nine=nine,ten=ten,eleven=eleven,twelve=twelve,thirteen=thirteen,fourteen=fourteen,fifteen=fifteen,sixteen=sixteen,reverse_exchange_rate=reverse_exchange_rate,reverse_one=reverse_one,reverse_two=reverse_two,reverse_three=reverse_three,reverse_four=reverse_four,reverse_five=reverse_five,reverse_six=reverse_six,reverse_seven=reverse_seven,reverse_eight=reverse_eight, reverse_nine=reverse_nine, reverse_ten=reverse_ten, reverse_eleven=reverse_eleven,reverse_twelve=reverse_twelve,reverse_thirteen=reverse_thirteen,reverse_fourteen=reverse_fourteen,reverse_fifteen=reverse_fifteen, reverse_sixteen=reverse_sixteen)
else:
message = "There was an error. Please try again."
return message
这是表格。html:
{% extends "layouts/main.html" %}
{% block content %}
<h1 style="text-align:center">Currency Exchange</h1>
<div style="margin-right:250px">
<div style="margin-left:250px">
<table style="border-collapse: collapse;", class="u-full-width">
<thead>
<tr>
<th>{{ currency_1 }}</th>
<th>{{ currency_2 }}</th>
<th>{{ currency_2 }}</th>
<th>{{ currency_1 }}</th>
</tr>
</thead>
<tbody>
<tr>
<td> 1 </td>
<td class="border-right"> {{ one }} </td>
<td> 1 </td>
<td> {{ reverse_one }} </td>
</tr>
<tr>
<td> 2 </td>
<td class="border-right"> {{two }} </td>
<td> 2 </td>
<td> {{ reverse_two }} </td>
</tr>
<tr>
<td> 3 </td>
<td class="border-right"> {{ three }} </td>
<td> 3 </td>
<td> {{ reverse_three }} </td>
</tr>
<tr>
<td> 4 </td>
<td class="border-right"> {{ four }} </td>
<td> 4 </td>
<td> {{ reverse_four }} </td>
</tr>
<tr>
<td> 5 </td>
<td class="border-right"> {{ five }} </td>
<td> 5 </td>
<td> {{ reverse_five }} </td>
</tr>
<tr>
<td> 6 </td>
<td class="border-right"> {{ six }} </td>
<td> 6 </td>
<td> {{ reverse_six }} </td>
</tr>
<tr>
<td> 7 </td>
<td class="border-right"> {{ seven }} </td>
<td> 7 </td>
<td> {{ reverse_seven }} </td>
</tr>
<tr>
<td> 8 </td>
<td class="border-right"> {{ eight }} </td>
<td> 8</td>
<td> {{reverse_eight }} </td>
</tr>
<tr>
<td> 9 </td>
<td class="border-right"> {{ nine }} </td>
<td> 9 </td>
<td> {{ reverse_nine }} </td>
</tr>
<tr>
<td> 10 </td>
<td class="border-right"> {{ ten }} </td>
<td> 10 </td>
<td> {{ reverse_ten }} </td>
</tr>
<tr>
<td> 11 </td>
<td class="border-right"> {{ eleven }} </td>
<td> 11 </td>
<td> {{ reverse_eleven }} </td>
</tr>
<tr>
<td> 12 </td>
<td class="border-right"> {{ twelve }} </td>
<td> 12 </td>
<td> {{ reverse_twelve }} </td>
</tr>
<tr>
<td> 13 </td>
<td class="border-right"> {{ thirteen }} </td>
<td> 13 </td>
<td> {{ reverse_thirteen }} </td>
</tr>
<tr>
<td> 14 </td>
<td class="border-right"> {{ fourteen }} </td>
<td> 14 </td>
<td> {{ reverse_fourteen }} </td>
</tr>
<tr>
<td> 15 </td>
<td class="border-right"> {{ fifteen }} </td>
<td> 15 </td>
<td> {{ reverse_fifteen }} </td>
</tr>
<tr>
<td> 16 </td>
<td class="border-right"> {{ sixteen }} </td>
<td> 16 </td>
<td> {{ reverse_sixteen }} </td>
</tr>
</tbody>
</table>
</div>
</div>
<div style="text-align:center">
<a class = "button button-primary" href="/form">Change Currencies</a>
</div>
{% endblock %}
有什么办法可以缩短所有这些吗?
我试图在 app.py 中创建一个范围(0,50)的 for 循环,尽管它会遍历整个循环,然后将最后一个数字发送到 table.html。 有没有办法将每个单独的数字发送到 table.html?
有不同的解决方案吗?
请记住,我已经编写了 3 周的代码,并且可能有一个非常简单的解决方案我还没有想出。 任何帮助表示赞赏。
正如@VPfB 所说,可能值得研究数据结构。 这是您可以如何将一些与现有代码一起使用的方法。
首先,我将为示例定义一个 static 汇率:
exchange_rate = 1.4
然后构建一个名为headers
的字典,其中包含以下值:
headers = {
'currency_1': 'USD',
'currency_2': 'CAD',
'exchange_rate': exchange_rate,
'reverse_exchange_rate': 1 / exchange_rate,
}
我刚刚在此处手动分配了字符串'USD'
和'CAD'
以进行演示,但显然您会从表单中获取这些字符串。
然后对于数字,您可以执行以下操作:
data = [dict(num=n,
normal = round(n * headers['exchange_rate'], 3),
reverse = round(n * headers['reverse_exchange_rate'], 3)
) for n in range(0, 16)]
这是使用列表理解。 上面的内容基本相同:
data = [] # an empty list
for n in range(0, 16):
d = {} # an empty dict
d['num'] = n
d['normal'] = round(n * headers['exchange_rate'], 3)
d['reverse'] = round(n * headers['reverse_exchange_rate'], 3)
data.append(d) # add this dict to the list.
也可以写成:
data = [] # an empty list
for n in range(0, 16):
d = dict(num = n,
normal = round(n * headers['exchange_rate'], 3),
reverse = round(n * headers['reverse_exchange_rate'], 3))
data.append(d) # add this dict to the list.
data
现在是一个字典列表。
然后,您可以将所有这些传递给您的模板:
return render_template('index.html', headers=headers, data=data)
然后在您的模板中,手动构建 header 行,并在data
列表中进行 Jinja for 循环:
<table>
<thead>
<tr>
<th>{{ headers['currency_1'] }}</th>
<th>{{ headers['currency_2'] }}</th>
<th>{{ headers['currency_2'] }}</th>
<th>{{ headers['currency_1'] }}</th>
</tr>
</thead>
<tbody>
{% for row in data %}
<tr>
<td> {{ row['num'] }} </td>
<td class="border-right"> {{ row['normal'] }} </td>
<td> {{ row['num'] }} </td>
<td> {{ row['reverse'] }} </td>
</tr>
{% endfor %}
</tbody>
</table>
这会在前端呈现,例如:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.