我的数据库中有一个表,其中容纳一些员工,每个员工都有一个分配的任务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>
答案 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.