![](/img/trans.png)
[英]How can I add the same login form as a modal on multiple pages using Flask-WTF and Jinja2?
[英]Flask/Jinja2 dynamic WTF form template
我正在尝试创建一个具有动态数量的输入字段的 jinaj2 模板。
该表单在 Flask 中成功生成,但是我遇到了 Jinja/HTML 的问题。
作为我的“非动态”工作示例的示例,我有一个标准表单字段“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 字符串从类中传递到渲染函数中。
与此同时,我将联系 Jinja2 开发团队,看看如何在模板本身内完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.