在Flask中如何使用WTForms动态生成表单?

想通过用户输入的数字如“5”,动态创建含有 5 个用户ID输入框的表单。想了几种实现方法都遇到了问题。

1.如果在视图函数中循环创建表单的5个实例,在渲染模版时 如何渲染指定数量的表单作为参数?

2.表单定义时根据用户输入的数字进行动态创建。看了flask-wtf 依然不清楚如何实现。

可以在视图函数里动态生成表单:

from flask import Flask, render_template
from flask_wtf import FlaskForm 
from wtforms import StringField

# ...  

@app.route('/test') 
def test(): 
    class DynamicForm(FlaskForm): 
        pass 

    for i in range(0, 5): 
        setattr(DynamicForm, 'form-' + str(i), StringField(i)) 

    form = DynamicForm() 
    return render_template('index.html', form=form) 

setattr()函数的三个参数分别是表单类(对象)、字段名(属性名)、字段值(属性值)。

你需要把range()中的5替换成代表用户输入值的变量。

渲染的方式和创建字段很相似,即使用for循环迭代所有字段:

<form method="POST"> 
{% for field in form if field.widget.input_type != 'hidden' %} 
{{ field.label }}{{ field }}<br> 
{% endfor %} 
</form> 

Flask-WTF集成了WTForms,添加了一些辅助函数。但具体的实现要参考WTForms的文档,这里有关于动态表单的说明:WTForms Documentation

更进一步,使用FieldList(WTForms Documentation)类,配合JavaScript,你可以在页面上添加一个“添加输入框”按钮,动态的增加字段。

猜你喜欢

转载自blog.csdn.net/c710473510/article/details/88935034