Python 使用Flask和WTForms如何创建一个表,其中一些列是输入?

Python 使用Flask和WTForms如何创建一个表,其中一些列是输入?,python,flask,wtforms,Python,Flask,Wtforms,我正在努力了解这是如何做到的,而文档似乎没有多大帮助 我需要生成一个表,行大小是可变的,但不是动态的(我知道在生成页面之前需要多少行) 为了简单起见,让我们设想一个页面,其中你用一个整数给n个考试打分 我试过这个: 表格。 class InputInteger(Form): grade = IntegerField('Grade') 视图 @decorator.. def grade(): form = InputInteger() names = student_li

我正在努力了解这是如何做到的,而文档似乎没有多大帮助

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

为了简单起见,让我们设想一个页面,其中你用一个整数给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>

名称
等级
{名称中的名称为%}
{{name}}
{{form.grade}}
但是我如何读回输入的值呢? 我如何区分谁的成绩也属于谁

我相当困惑,我读过关于FieldList(FormField(IntegerField)),但这不就是一个包含整数列表的字段吗? 关于表格小部件,我需要它吗


请帮忙。

你几乎是对的。将表放在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']
,然后执行您的操作。我希望我的解释清楚。

你几乎是对的。将表放在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']
,然后执行您的操作。我希望我的解释是清楚的。

对于现在看这篇文章的人来说,OP认为
FieldList
s和
FormField
s是正确的。以下是一个解决方案:

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

{form.gradeset%中的优点为%1}
{{merit.placeing(readonly=true)}{{merit.csrf_-token}{{merit.hidden_-tag()}}
{{merit.grade}
{{merit.delete}
{%endfor%}

对于现在看这篇文章的人来说,OP正确地考虑了
FieldList
s和
FormField
s。以下是一个解决方案:

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

{form.gradeset%中的优点为%1}
{{merit.placeing(readonly=true)}{{merit.csrf_-token}{{merit.hidden_-tag()}}
{{merit.grade}
{{merit.delete}
{%endfor%}

但如何同时为多个姓名评分?很抱歉,我没有按照请求进行操作。表单['grade']将向我提供年级输入列表,以及如何告知他们的年级名称。如果使用for循环生成输入,请确保为每个主题提供唯一的名称。然后,当您通过提交表单发布更改时,您的函数将接收表单及其所有输入数据。如果你仍然不明白我的意思,我会为你发布一个完整的解决方案。但是我怎么能同时给几个名字打分呢?很抱歉,我没有按照请求进行操作。表单['grade']将向我提供年级输入列表,以及如何告知他们的年级名称。如果使用for循环生成输入,请确保为每个主题提供唯一的名称。然后,当您通过提交表单发布更改时,您的函数将接收表单及其所有输入数据。如果你仍然不明白我的意思,我会为你发布一个完整的解决方案。