当前位置:   article > 正文

python flask 表单提交_python – Flask Form数据在提交时重复

flask提交重复数据处理

我试图填充一个当前值的表,然后改变它的目的是找到原始和后的差异.我在下面简化我的代码来复制问题: –

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

{{ form.name}}

{{ form.hidden_tag() }}

stockprice

{% for stock in form.stockItem %}

{{ stock.stock }}{{ stock.price }}

{% endfor %}

results.html

{% for line in results %}

{{ line }}

{% endfor %}

如果我要更改一些字段的值,生成的变量结果将包含数据帧中原始3行的6行数据的副本

例如

{'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'}

此外,我也有问题我的原始十进制用于变成一些长浮点值,在上面的例子中,我将bcd值从11.53更改为13,原始值变为长浮点数,其余我没有编辑保持原始.

我可以有一个肮脏的解决方案,将结果切成两半并比较两半之间的值,舍入那些长浮点数以找到有变化的值,但似乎非常低效.

有人可以帮忙吗?

解决方法:

首先,您需要在Pandas DataFrame中使用适当的Decimal类型. (可以通过使用Numpy的dtype和对象来处理Pandas).

其次,当POST请求发生时,您正在使用原始数据填充表单.

一些固定的视图函数看起来像这样:

@app.route('/', methods=['GET','POST'])

def sEntry():

# Create form and fill it with request data

form = stockListForm(request.form)

# Set up initial data with proper Decimal objects

stocklist=pd.DataFrame(data=[['abc',Decimal('10.17')],['bcd',Decimal('11.53')],['edf',Decimal('12.19')]],columns=['stock','price'])

# Handle valid POST request

if form.validate_on_submit():

# Convert form data to dictionary (so we can later easily query stock price)

stocks = {i['stock']: i['price'] for i in form.stockItem.data}

# Generate result (as generator) ...

results = ((i.stock, i.price, i.price - stocks[i.stock]) for i in stocklist.itertuples())

# ... and push it to template

return render_template('results.html', results=results)

print(form.errors)

# ...build initial form for GET request

for stock in stocklist.itertuples():

sForm=stockForm()

sForm.stock=stock.stock

sForm.price=stock.price

form.stockItem.append_entry(sForm)

return render_template('sEntry.html',form=form)

来源:https://www.icode9.com/content-1-287801.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/499315
推荐阅读
相关标签
  

闽ICP备14008679号