【问题标题】:Flask WTForm Creating WTForm's SelectField Element dynamicallyFlask WTForms 动态创建 WTForms SelectField 元素
【发布时间】:2019-12-08 15:57:26
【问题描述】:

我的数据库中有一个表,其中包含一些员工,每个员工都有一个分配的任务 ID。我想根据具有特定任务 ID 的员工数量动态创建选择字段。例如,如果有 3 个任务 ID 为 1 的员工,则将有三个选择字段(每个字段有 5 个下拉项) 在form.py中

 class DynamicForm(Form):
    @classmethod 
    def append_field(cls, name, field):
        setattr(cls, name, field)
        return cls  

在 routes.py -- 主文件中

assigns = Project_Users.query.filter_by(project_id=id).all() 
// query the database to get all the staff under the project using the project id 
l = len(assigns) // length/ number of staff

d = DynamicForm() // from form.py
for e in range(l):         
  d.append_field(assigns[e].admin.first_name,SelectField(assigns[e].admin.first_name, validators=[DataRequired()], choices=[('0', 'No Task'),( '1','Site Acquisition'),('2','Installation'),('3','Configuration'), ('4','Commission')]))

    d.append_field('submit', SubmitField('SAVE')) // this is outside the for loop

在html模板中

<form action="/project/{{ project.id }}/tasks" method="POST">
                  {{ d.hidden_tag() }}
                <table class="table is-stripped" style="width: 100%;">
                    <tbody>
                      {% for g in d %}
                      <tr>
                        <td>{{ g.label }}</td>
                        <td>{{ g }}</td>
                      </tr>
                      {% endfor %}

                      </tbody>
                  </table>
              </form>

上面的代码正在工作,但它没有改变,并且人员数量发生了变化,例如,项目 1 有 3 个工作人员,它呈现了三个选择字段,但是当项目 2 有 2 个工作人员被呈现时,出现了 3 个工作人员和 3 个选择字段

【问题讨论】:

    标签: python forms flask flask-wtforms


    【解决方案1】:

    尝试使用参数动态覆盖构造函数来构建表单:

    class DynamicForm(Form):
        submit = SubmitField
    
        def __init__(self, **kwargs):
            assigns = Project_Users.query.filter_by(project_id=kwargs['id']).all()
            for ass in assigns:         
                setattr(DynamicForm,
                        ass.admin.first_name,
                        SelectField(ass.admin.first_name, 
                                    validators=[DataRequired()], 
                                    choices=[('0', 'No Task'),
                                             ( '1','Site Acquisition'),
                                             ('2','Installation'),
                                             ('3','Configuration'),
                                             ('4','Commission')]))
            super().__init__()
    

    那你就这么称呼它

    d = DynamicForm(id=1)
    

    从技术上讲,这与您的表单之间的区别在于,您在初始化表单之后添加类级别属性,并且在基础Form 运行之后。即两者之间存在差异:

    DynamicForm(Form):
        def __init__(self)
            super().__init__() # calls Form.__init__()
            # extra stuff
    

    DynamicForm(Form):
        def __init__(self)
            # extra stuff
            super().__init__() # calls Form.__init__() and acts on extra stuff.
    

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2016-07-10
      • 2019-07-23
      • 2021-01-30
      • 1970-01-01
      • 2017-08-28
      相关资源
      最近更新 更多