tia*_*lva 1 python flask wtforms
我正在努力了解这是如何完成的,并且文档似乎没有多大帮助。
我需要生成一个表,行大小是可变的,但不是动态的(我知道在生成页面之前需要多少行)。
为了简单起见,让我们想象一个页面,您用一个整数对 n 个考试进行评分。
我试过这个:
表格。
class InputInteger(Form):
grade = IntegerField('Grade')
Run Code Online (Sandbox Code Playgroud)
风景
@decorator..
def grade():
form = InputInteger()
names = student_list
return render_template("grade.html", form=form, names=names)
Run Code Online (Sandbox Code Playgroud)
模板
<table>
<tr>
<th>Name</th>
<th>Grade</th>
</tr>
{% for name in names %}
<tr>
<td>
{{name}}
</td>
<td>
{{form.grade}}
</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
但是我如何读回输入的值呢?我如何区分谁也属于谁的年级?
我很困惑,我读过有关 FieldList(FormField(IntegerField)) 的内容,但这不只是一个带有整数列表的字段吗?表格小部件怎么样,我需要它吗?
请帮忙。
对于现在看到这个问题的任何人来说,OP 对FieldLists 和FormFields 的思考是正确的。这是一个解决方案:
形式.py:
class GradeForm(FlaskForm):
student = IntegerField('Student ID')
grade = IntegerField('Grade')
delete = BooleanField('Delete')
class GradeFormSet(FlaskForm):
gradeset = FieldList(FormField(GradeForm), min_entries=0)
Run Code Online (Sandbox Code Playgroud)
视图.py:
def grade():
# create a dict of student IDs and their initial grades (or None for now)
init_merits = [dict(student=s.id, grade=None) for s in myStudentTable.query.all()]
gradeform = GradeFormSet(gradeset=init_merits)
if form.validate_on_submit():
...
# meritforms.data['gradeset'] contains a list of dictionary values for further processing
# check 'delete' == True to handle deletion of that student from your table
...
return render_template('template.html', form=gradeform)
Run Code Online (Sandbox Code Playgroud)
模板:
<table>
{% for merit in form.gradeset %}
<tr>
<td>{{ merit.placing(readonly=true) }} {{ merit.csrf_token }} {{ merit.hidden_tag() }}</td>
<td>{{ merit.grade }}</td>
<td>{{ merit.delete }}</td>
</tr>
{% endfor %}
</table>
<input type="submit" name="finish" value="Save">
<input type="submit" name="cancel" value="Cancel">
Run Code Online (Sandbox Code Playgroud)