Flask/Jinja2动态WTF表单模板

Flask/Jinja2 dynamic WTF form template

我正在尝试创建一个具有动态输入字段数量的 jinaj2 模板。

表格在 Flask 中成功生成,但是我在使用 Jinja/HTML 时遇到问题。

作为我的 "non-dynamic" 工作示例的示例,我有一个标准表单字段 "forID" 和四个硬编码字段表单字段+(字段编号)。

{{ form.csrf_token }}
{{ wtf.form_field(form.formID) }}

{{ wtf.form_field(form.field1) }}
{{ wtf.form_field(form.field2) }}
{{ wtf.form_field(form.field3) }} 
{{ wtf.form_field(form.field4) }}

我可以用什么方法使Jinja/HTML动态化。我已经尝试过 EVAL 和 EVEC,但是 Jinja 不支持这些 Python 命令。

#<form method="POST" action = "{{url_for('myHtmlTemplate')}}">
{{ form.csrf_token }}
{{ wtf.form_field(form.formID) }}

{% for i in form.myDynamicFields.keys() %}:
     {{ eval(' wtf.form_field(form.'+'i')') }}
{% endfor %}    

<input class="btn btn-success" type="submit" value="Submit">
#</form>

我当前的 myForm。

class myform(FlaskForm):
connection = removed
result = connection.execute("SELECT * FROM sqltable")
result = result.fetchall()

scenarioList = []
fieldList = []
fieldLabel = []

for scen in result:
scenarioList.append("Scenario: " + scen[0])
fieldList.append("field: " + scen[0])

for i in range(len(result)):
fieldLabel.append("My Field" + str(i + 1))

myDynamicFields = dict(zip(fieldLabel, fieldList))
formID = StringField('Form ID')

for key, val in myDynamicFields.items():
exec(key + '=StringField(val)')

' wtf.form_field(form.'+'i')' 有奇数个撇号,这是语法问题

我猜你想要更接近于:

' wtf.form_field(form.' + i + ')'

让你得到

i = 'your_field'
print(' wtf.form_field(form.' + i + ')')

wtf.form_field(form.your_field)

我同意@DanielRoseman 的评论。我可能会更像下面这样处理问题(如果它适用于您的实现):

{% for field in form.myDynamicFields %}:
     {{ wtf.form_field(field) }}
{% endfor %} 

我没有设法使用上面讨论的迭代字典的方法,尽管如果它可以工作我同意它会更优雅。

不过,我有一个变通办法。在我的表单实例中生成 HTML 作为文本字符串,从模板开始并动态构建部分 Jinja2 无法评估而没有错误。我将这个 HTML 字符串从 class 传递到渲染函数中。

与此同时,我将联系 Jinja2 开发团队,看看如何在模板中完成它。