WTForms/Flask:动态 min_entries
WTForms/Flask: Dynamic min_entries
我想动态地使用 min_entries WTForms 参数,即没有硬编码数字。
在 form.py 中看起来像这样:
class TestSpecForm(FlaskForm):
student_number = IntegerField('Number of Students')
class StudentForm(FlaskForm):
answer = StringField('')
class TestInputForm(FlaskForm):
students = FieldList(FormField(StudentForm)) # I'd like to insert the dynamic min_entries here
submit = SubmitField('Submit')
以及 views.py 中的类似内容:
def input(key_id):
key = Testspecs.query.get_or_404(key_id)
student_number = key.student_number
form = TestInputForm()
form.students.min_entries = student_number
if form.validate_on_submit():
...
但是,这不起作用,只是为 TestInputForm 呈现 NO FIELDS。如果我将 "min_entries = 10" 放入 TestInputForm 的学生变量中,一切都会按预期进行。但我无法动态完成它。
有人可以帮帮我吗?根据我所有的 google/reddit/SO 搜索,这基本上是 WTForms 中大多数参数或验证器的动态设置方式。
谢谢
无法动态覆盖 FieldList
上的 min_entries
。
解决方法是将表单子类化并绑定一个新的 FieldList
与所需的值。
因此您的代码必须如下所示:
def input(key_id):
key = Testspecs.query.get_or_404(key_id)
student_number = key.student_number
# Subclass form and bind new field
class LocalForm(TestInputForm):pass
LocalForm.students = FieldList(FormField(StudentForm), min_entries=student_number)
# Use our new form
form = LocalForm()
if form.validate_on_submit():
...
我刚刚发现有关字段列表和表单字段的信息,并在互联网上搜索文档或示例,但几乎没有找到帮助。我想出了在渲染模板时获取动态条目数的好方法,所以我想我会在这里提交它以防它对任何人有帮助。请注意,这不会解决使用按钮或类似的东西动态添加条目的问题。
def input(key_id):
key = Testspecs.query.get_or_404(key_id)
student_number = key.student_number
form = TestInputForm()
# if the form was submitted, then it will collect all the entries for us
if form.validate_on_submit():
# form has whatever entries were just submitted
for entry in form.students.entries:
...
return(redirect(...))
# if we get here, either validation failed or we're just loading the page
# we can use append_entry to add up to the total number we want, if necessary
for i in range(len(form.students.entries), student_number):
form.students.append_entry()
return render_template("input.html", form=form)
我想动态地使用 min_entries WTForms 参数,即没有硬编码数字。
在 form.py 中看起来像这样:
class TestSpecForm(FlaskForm):
student_number = IntegerField('Number of Students')
class StudentForm(FlaskForm):
answer = StringField('')
class TestInputForm(FlaskForm):
students = FieldList(FormField(StudentForm)) # I'd like to insert the dynamic min_entries here
submit = SubmitField('Submit')
以及 views.py 中的类似内容:
def input(key_id):
key = Testspecs.query.get_or_404(key_id)
student_number = key.student_number
form = TestInputForm()
form.students.min_entries = student_number
if form.validate_on_submit():
...
但是,这不起作用,只是为 TestInputForm 呈现 NO FIELDS。如果我将 "min_entries = 10" 放入 TestInputForm 的学生变量中,一切都会按预期进行。但我无法动态完成它。
有人可以帮帮我吗?根据我所有的 google/reddit/SO 搜索,这基本上是 WTForms 中大多数参数或验证器的动态设置方式。
谢谢
无法动态覆盖 FieldList
上的 min_entries
。
解决方法是将表单子类化并绑定一个新的 FieldList
与所需的值。
因此您的代码必须如下所示:
def input(key_id):
key = Testspecs.query.get_or_404(key_id)
student_number = key.student_number
# Subclass form and bind new field
class LocalForm(TestInputForm):pass
LocalForm.students = FieldList(FormField(StudentForm), min_entries=student_number)
# Use our new form
form = LocalForm()
if form.validate_on_submit():
...
我刚刚发现有关字段列表和表单字段的信息,并在互联网上搜索文档或示例,但几乎没有找到帮助。我想出了在渲染模板时获取动态条目数的好方法,所以我想我会在这里提交它以防它对任何人有帮助。请注意,这不会解决使用按钮或类似的东西动态添加条目的问题。
def input(key_id):
key = Testspecs.query.get_or_404(key_id)
student_number = key.student_number
form = TestInputForm()
# if the form was submitted, then it will collect all the entries for us
if form.validate_on_submit():
# form has whatever entries were just submitted
for entry in form.students.entries:
...
return(redirect(...))
# if we get here, either validation failed or we're just loading the page
# we can use append_entry to add up to the total number we want, if necessary
for i in range(len(form.students.entries), student_number):
form.students.append_entry()
return render_template("input.html", form=form)