【发布时间】:2019-01-06 08:02:46
【问题描述】:
我有一个表单,用户可以在其中动态添加字段。提交此表单时,后端只看到后端生成的字段
#forms.py
class ExpensesForm(FlaskForm):
expense_name = StringField('Expense_Item', validators=[DataRequired()])
cost = FloatField('Cost', validators=[DataRequired()])
due_date = DateField('Due Date', format='%Y-%m-%d', validators=[DataRequired()], default=datetime.datetime.today().date())
type = SelectField('Role', choices=[('mutual', 'Mutual'),
('personal#1', 'Personal #1'),
('personal#2', 'Personal #2')
])
我正在传递这个表格
return render_template('index.html', form=form, ...) 从main.py 到index.html
所有 4 个字段都是通过生成的;
<form class="form-horizontal" id="main-form" enctype=multipart/form-data role="form" method="post" action="/">
<input type="hidden" name="count" value="1"/>
{{ form.csrf_token }}
{{ form.expense_name(placeholder="Expense Name", id="expense_1", value="") }}
{{ form.cost(placeholder="Cost", id="cost_1", class="cost", value="") }}
{{ form.due_date(id="due_date_1") }}
{{ form.type(placeholder="Type", id="type_1") }}
<button id="b1" class="btn btn-info add-more" type="button">+</button>
<small>Press + to add another set of fields.</small>
<br>
<hr>
<button class="btn btn-sm btn-success" type="submit">Post Expense</button>
</form>
JQuery sn-p 在每个按钮按下后生成具有不同(唯一)id 的相同字段,作为最后一个#type_ id 之后的一行新字段。
当我点击提交按钮时,后端只接收第一行而不是生成的。
我在这里错过了什么?
更新:
# main.py
@main_blueprint.route('/', methods=['GET', 'POST'])
def index():
dates = []
form = ExpensesForm(request.form)
if request.method == 'POST':
print(form.data)
# prints the following even when the browser sends more than 1 set of data:
# {'due_date': None, 'csrf_token': long_hash, 'expense_name': 'Electric', 'cost': 13.0, 'type': 'mutual'}
if form.validate_on_submit():
for n in range(len(form.expense_name.data)):
if form.expense_name.raw_data[n] != '':
data = Expenses(form.expense_name.raw_data[n].title(),
form.cost.raw_data[n],
datetime.datetime.strptime(form.due_date.raw_data[n], '%Y-%m-%d').date(),
form.type.raw_data[n].title(),
)
print(data)
db.session.add(data)
db.session.commit()
return redirect(url_for('main.index'))
expenses = db.session.query(Expenses).all()
# expenses_schema = ExpensesSchema()
# output = expenses_schema.dump(expenses).data
output = []
for i in expenses:
output.append(i.__dict__)
return render_template('index.html', form=form, expenses=output)
更新 2
由于form.data 是一个字典,我无法将名称与新字段匹配。但即使我为添加的字段提供唯一名称,后端也只会显示带有print(form.data) 的初始表单字段,但如果我这样做了;
for k, v in request.form.items():
print(k, v)
我得到了所有的字段。对我来说似乎不是正确的方法。有什么想法吗?
【问题讨论】:
-
您是否通过添加新类型进行多选?
-
@snakecharmerb 浏览器发送所有数据。但后端没有得到它们。
-
@VillageMonkey 不确定“通过添加新类型进行多选”是什么意思