I try to fill in a table of current values, and then change it with the intention of finding the difference between the original and after. I simplify my code in the following to replicate the problem: -
webapp.py
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, DecimalField, fields
import pandas as pd
app=Flask(__name__)
app.config['SECRET_KEY'] = 'wtf'
class stockForm(FlaskForm):
stock=StringField()
price= DecimalField()
def __init__(self, csrf_enabled=False, *args, **kwargs):
super(stockForm, self).__init__(csrf_enabled=csrf_enabled, *args, **kwargs)
class stockListForm(FlaskForm):
stockItem=fields.FieldList(fields.FormField(stockForm))
@app.route('/sEntry', methods=['GET','POST'])
def sEntry():
form=stockListForm()
stocklist=pd.DataFrame(data=[['abc',10.17],['bcd',11.53],['edf',12.19]],columns=['stock','price'])
for stock in stocklist.itertuples():
sForm=stockForm()
sForm.stock=stock.stock
sForm.price=stock.price
form.stockItem.append_entry(sForm)
if form.validate_on_submit():
results = []
for idx, data in enumerate(form.stockItem.data):
results.append(data)
print(results)
del form
return render_template('results.html', results=results)
print(form.errors)
return render_template('sEntry.html',form=form)
if __name__=='__main__':
app.run(debug=True, use_reloader=True, host='0.0.0.0', port=int('5050'))
sEntry.html
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<form action="" method="POST" name="form">
{{ form.name}}
{{ form.hidden_tag() }}
<div>
<table>
<thead >
<tr class="col">
<th style="width: 30px">stock</th>
<th style="width: 50px">price</th>
</tr>
</thead>
{% for stock in form.stockItem %}
<tr class="col">
<td>{{ stock.stock }}</td>
<td>{{ stock.price }}</td>
</tr>
{% endfor %}
</table>
</div>
<p><input type="submit" name="edit" value="Send"></p>
</form>
</body>
</html>
results.html
<ul>
{% for line in results %}
<li>{{ line }}</li>
{% endfor %}
</ul>
if I want to change the values of several fields, the generated variables will have a duplicate of 6 data lines from my original 3 lines in data frames for example.
{'price': Decimal('10.17'), 'stock': 'abc'}
{'price': Decimal('13'), 'stock': 'bcd'}
{'price': Decimal('12.19'), 'stock': 'edf'}
{'price': 10.17, 'stock': 'abc'}
{'price': 11.529999999999999, 'stock': 'bcd'}
{'price': 12.19, 'stock': 'edf'}
In addition, I also have problems with my original Decimals used to turn into some long float values, in the above example I change the bcd value from 11.53 to 13, the original value becomes a long floating point figure, the rest that I did not edit remains as the original.
, , , , .
- ?