使用Flask和WTForms我怎么能有一个表,其中一些列是输入?

时间:2014-07-18 14:55:50

标签: python flask wtforms

我很难看到这是如何完成的,而且文档似乎没什么帮助。

我需要生成一个表,行大小是可变的,但不是动态的(我知道在生成页面之前我需要多少行。)

为了简单起见,我们设想一个页面,您可以使用整数对n个考试进行评分。

我试过这个:

表单。

class InputInteger(Form):
    grade = IntegerField('Grade')

视图

@decorator..
def grade():
    form = InputInteger()
    names = student_list

    return render_template("grade.html", form=form, names=names)

模板

<table>
    <tr>
        <th>Name</th>
        <th>Grade</th>
    </tr>
    {% for name in names %}
    <tr>
        <td>
            {{name}}
        </td>
        <td>
            {{form.grade}}
        </td>
    </tr>
</table>

但我如何读回输入值? 我如何区分属于谁的成绩?

相当困惑,我已经读过有关FieldList(FormField(IntegerField))的信息,但是并不是只有一个带有整数列表的字段? Table Widget怎么样,我需要它吗?

请帮忙。

2 个答案:

答案 0 :(得分:3)

对于现在正在查看此内容的任何人,OP都正确地考虑了FieldListFormField。这是一个解决方案:

forms.py:

class GradeForm(FlaskForm):
    student = IntegerField('Student ID')
    grade = IntegerField('Grade')
    delete = BooleanField('Delete')

class GradeFormSet(FlaskForm):
    gradeset = FieldList(FormField(GradeForm), min_entries=0)

view.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)

模板:

<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">

答案 1 :(得分:1)

你几乎是对的。将您的表放在一个html表单中,并捕获一个可以检索输入字段的函数。 这是一个例子:

<form action="/grade">
<table>
<tr>
    <th>Name</th>
    <th>Grade</th>
</tr>
{% for name in names %}
<tr>
    <td>{{name}}</td>
    <td><input id='{{name}}' value='{{form.grade}}' "></td>
</tr>
</table>
</form

你的烧瓶功能

@app.route('/grade', methods=['GET', 'POST'])
def grade():
    if request.method == 'POST':
      return 'Form posted.'

当您将表单发布到您的功能时,您可以通过request.form['inputfieldname']这样的方式访问您的输入字段,而不是您做的事情。我希望我的解释清楚。 祝你好运!!!