形式有多条相同的线条

时间:2015-12-31 17:43:07

标签: python flask wtforms flask-wtforms

我正在编写一个Flask应用程序,用户必须输入他们计划在一个学期内完成的所有大学课程。所需数据是代码(例如' CMPT')和数字(例如' 101')。

我希望用户能够输入最多 10门课程。我想通过重用我创建的CourseForm来完成此操作,而不是手动为每个课程创建字段。我使用FieldListFormField来创建一个使用CourseForm的新表单,但我无法正常显示。

如何创建一个包含10个课程位置的表单?

class CourseForm(Form):
    code = SelectField('Course Code', choices=CHOICES)
    number = IntegerField('Course Number')

@app.route(...)
def index():
    form = CourseForm()
    return render_template('main.html', title='Main', form=form)

main.html

...
<form action="" method="post" name="course">
    {{ form.hidden_tag() }}
    <p>{{ form.code() }} {{ form.number() }}</p>
    <p><input type="submit" value="Submit"></p>
</form>
...

1 个答案:

答案 0 :(得分:1)

您使用FieldListFormField开启了正确的轨道。

CourseForm开始。

class CourseForm(Form):
    code = SelectField('Course Code', choices=CHOICES)
    number = IntegerField('Course Number')

然后您需要将其封装在另一个表单中。为了这个例子,我将其称为RegisteredCoursesForm。您可以使用max_entries将条目数限制为10.如果您总是希望有10个条目可用,即使它们都不会被填写,您也可以包含min_entries

class RegisteredCoursesForm(Form):
    courses = FieldList(FormField(CourseForm), min_entries=10, max_entries=10)
    # Any other fields can go here (e.g., user_id).

您希望将此新表单传递给模板,而不是CourseForm

def index():
    form = RegisteredCoursesForm()
    return render_template('main.html', title='Main', form=form)

最后,您可以遍历courses字段,以便在不包含CourseForm的情况下包含所有字段。

<form action="" method="post" name="course">
    {{ form.hidden_tag() }}
    {% for course_form in form.courses %}
        <p>{{ course_form.code }} {{ course_form.number }}</p>
    {% endfor %}
    <p><input type="submit" value="Submit"></p>
</form>