我正在编写一个Flask应用程序,用户必须输入他们计划在一个学期内完成的所有大学课程。所需数据是代码(例如' CMPT')和数字(例如' 101')。
我希望用户能够输入最多 10门课程。我想通过重用我创建的CourseForm
来完成此操作,而不是手动为每个课程创建字段。我使用FieldList
和FormField
来创建一个使用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>
...
答案 0 :(得分:1)
您使用FieldList
和FormField
开启了正确的轨道。
从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>