簡體   English   中英

Flask WTForm 動態創建 WTForm 的 SelectField 元素

[英]Flask WTForm Creating WTForm's SelectField Element dynamically

我的數據庫中有一個表,其中包含一些員工,每個員工都有一個分配的任務 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 個選擇字段

嘗試構造您的表單,動態地用參數覆蓋構造函數:

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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM