【问题标题】:WTForms/Flask: Dynamic min_entriesWTForms/Flask:动态 min_entries
【发布时间】:2019-07-23 21:33:34
【问题描述】:

我希望动态使用 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 中大多数参数或验证器的动态设置方式。

谢谢

【问题讨论】:

    标签: python flask dynamic parameters wtforms


    【解决方案1】:

    我刚刚发现了字段列表和表单字段,并在互联网上搜索了文档或示例,但几乎没有找到任何帮助。我想出了在渲染模板时获取动态条目数的好方法,所以我想我会在这里提交它以防它对任何人有帮助。请注意,这并不涉及使用按钮或类似的东西即时添加条目。

    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)
    

    【讨论】:

      【解决方案2】:

      无法动态覆盖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():
              ...
      

      【讨论】:

      • 非常感谢您的回答!我回家后试试看
      猜你喜欢
      • 2020-01-18
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2012-10-12
      • 2013-08-13
      • 1970-01-01
      • 2017-08-28
      • 2015-03-05
      相关资源
      最近更新 更多