[英]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.