在我的项目中,我想创建几对 Select 字段来组合不同的材料(在材料的所有标签中进行选择,在 0.1 和 20 % 之间进行选择)。这是我的表格:
class MatForm(Form):
mat = SelectField()
class List_Compose_Form(Form):
list_mat = FieldList(FormField(MatForm))
submit=SubmitField('Select Composition')
因此,我创建了一个函数来创建一个具有默认值的 Mat 表单列表,该列表具有所有键的默认值,例如 ('Batch(MAT)' 或 'MAT (%)') 以及所有相关的可能选择(可能标签列表或之间的范围0.1 和 20 :
def compose_form(等级):
raw_name = 'interface_app\grades_raw\\'+str(grades)+'_clnd.raw'
[dic_compose,dic_choice] = pickle.load(open(raw_name,'rb'))
all_mat_items = []
for key, values in dic_compose.items():
mat_id = uuid.uuid1()
mat_entry = MatForm(request.form)
mat_entry.mat.label = key
mat_entry.id = mat_id
if re.search('%',str(key)) :
choice = [(values,values)]
choice += [(str(i/10),str(i/10)) for i in range(1,200)]
else:
choice = [(values, values)]
choice += [(dic_choice[key][i],dic_choice[key][i]) for i in range(1,len(dic_choice[key]))]
mat_entry.mat.choices = choice
all_mat_items.append(mat_entry)
return(all_mat_items)
这部分实际上正在工作,我确实可以创建我的作文: 作文页面
这是我创建列表并将数据保存在会话中的应用程序
@app.route("/compose",methods=['GET','POST'])
@grade_required
def compose():
the_grade=session['grade']
session['dic_compos'] = {}
form =List_Compose_Form(request.form)
list_mat = compose_form(the_grade)
form.list_mat = list_mat
if form.submit.data and form.validate():
for k in form.list_mat :
k.validate()
session['dic_compos'].update({k.mat.label : k.mat.data})
return redirect(url_for('test'))
return render_template('compose.html',form=form)
但是由于某些未知原因,我从每个字段中获得的数据被第一个覆盖,例如: 组合后的会话字典
对我来说,这个问题可能与我的组合循环中的 MatForm(request.form) 或可能与我的 jinja2 模板有关:
<div class="table-responsive-sm">
<form action="" method="post" role="form">
<table id="data" class="table table-dark table-responsive overflow-auto" style="height:400px">
<thead >
<tr>
<th>Labels</th>
<th>Selected</th>
</tr>
</thead>
<tbody>
{% for mat_form in form.list_mat %}
<tr>
<th>{{mat_form.mat.label}}</th>
<th>{{mat_form.mat}}</th>
</tr>
{% endfor %}
</form>
</tbody>
</table>
<div>
{{ form.submit }}
</div>
</form>
我尝试添加 csrf 令牌或使用不同名称的(_formhelpers.html)中的 render_field 以避免覆盖但没有任何效果。我从 2 天开始就在处理这个问题,所以欢迎每一个帮助。
如果您需要额外的精确度/解释,请告诉我这是我的第一个问题。