我有一个Flask应用程序,我可以通过上传CSV文件填充表单数据然后读取.我想用从CSV读取的数据填充FieldList.但是,当我尝试填充数据时,它会将原始HTML输入到TextFields中,而不仅仅是我想要的值.我究竟做错了什么?
app.py
from flask import Flask, render_template, request, url_for
from flask.ext.wtf import Form
from wtforms import StringField, FieldList, FormField, SelectField
from wtforms.validators import DataRequired
from werkzeug.datastructures import MultiDict
app = Flask(__name__)
app.config['SECRET_KEY']='asdfjlkghdsf'
# normally student data is read in from a file uploaded, but for this demo we use dummy data
student_info=[("123","Bob Jones"),("234","Peter Johnson"),("345","Carly Everett"),
("456","Josephine Edgewood"),("567","Pat White"),("678","Jesse Black")]
class FileUploadForm(Form):
pass
class StudentForm(Form):
student_id = StringField('Student ID', validators = [DataRequired()])
student_name = StringField('Student Name', validators = [DataRequired()])
class AddClassForm(Form): …Run Code Online (Sandbox Code Playgroud) 我正在使用Flask建立一个网站,我在其中使用WTForms.在表单中,我现在想要使用FormFields的FieldList,如下所示:
class LocationForm(Form):
location_id = StringField('location_id')
city = StringField('city')
class CompanyForm(Form):
company_name = StringField('company_name')
locations = FieldList(FormField(LocationForm))
Run Code Online (Sandbox Code Playgroud)
所以让人们有能力进入一个有两个地点的公司(动态添加地点的时间比较晚)我在前面这样做:
<form action="" method="post" role="form">
{{ companyForm.hidden_tag() }}
{{ companyForm.company_name() }}
{{ locationForm.location_id() }}
{{ locationForm.city() }}
{{ locationForm.location_id() }}
{{ locationForm.city() }}
<input type="submit" value="Submit!" />
</form>
Run Code Online (Sandbox Code Playgroud)
所以在提交时我打印的位置:
print companyForm.locations.data
Run Code Online (Sandbox Code Playgroud)
但我明白了
[{'location_id': u'', 'city': u''}]
Run Code Online (Sandbox Code Playgroud)
我可以使用locationForm打印第一个位置的值(见下文),但我仍然不知道如何获取第二个位置的数据.
print locationForm.location_id.data
print locationForm.city.data
Run Code Online (Sandbox Code Playgroud)
所以位置列表确实有一个带空值的dict,但是:
有谁知道我在这里做错了什么?欢迎所有提示!
关于如何使用WTForms的FieldList,确实缺乏文档.所以,多亏了互联网,我已经能够将以下内容整合在一起:
形成:
class BranchForm(Form):
name = StringField('Name', validators = [Required()])
equipment = FieldList(SelectField('Equipment', validators=[Required()], coerce=int,
choices = [(x.id, x.name) for x in Equipment.query.all()]))
mod = FieldList(StringField('Method of Delivery', validators = [Optional()]))
Run Code Online (Sandbox Code Playgroud)
视图:
def edit_branch(id):
branch = Branch.query.filter_by(id=id).first()
#populate data_in to be used by BranchForm
data_in = []
for eq_obj in branch.equipment_assoc:
data_in.append(('equipment', eq_obj.equipment.id))
data_in.append(('mod', eq_obj.mod))
editform = BranchForm(data=MultiDict(data_in))
if editform.validate_on_submit():
branch.name = editform.name.data
db.session.add(branch)
db.session.commit()
return redirect('/admin/branches/' + str(branch.id))
editform.name.data = branch.name
return render_template("branch_edit.html",
title="Edit Branch",
branch = branch,
editform …Run Code Online (Sandbox Code Playgroud) 我看到同样奇怪的行为发布到Filling WTForms FormField FieldList with data results in HTML in fields,其中我的原始字段使用 HTML 而不是默认值呈现。在另一个示例中,FieldList 基本上在单个 FormField 上进行了一层深度堆叠。就我而言,我在 FormField 上的 FieldList 上创建 FieldList 的 2D 结构。我不知道我在哪里。
应用程序.py
import os
from flask import Flask, redirect, render_template, request, send_file, url_for
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect
from wtforms import FieldList, FormField, RadioField, TextAreaField, validators
app = Flask(__name__)
csrf = CSRFProtect(app)
SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY
#region FORMS
class TestCaseItem(FlaskForm) :
pass_fail_radio = RadioField( '' , choices=[('Pass','Pass'), ('Fail','Fail')] , default='Pass' …Run Code Online (Sandbox Code Playgroud)