Flask WTForm动态创建WTForm的SelectField元素

时间:2019-11-28 13:56:04

标签: python forms flask flask-wtforms

我的数据库中有一个表,其中容纳一些员工,每个员工都有一个分配的任务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个选择字段< / p>

1 个答案:

答案 0 :(得分:0)

尝试构造带有参数的动态覆盖构造器的表单:

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.