首页 > 解决方案 > 在烧瓶中的烧瓶wtf表单字段上使用通配符

问题描述

我一直在使用 flask-wtf 构建一个问卷。我的问题有 30 个问题,将来可能会增加。

通过阅读 flask-wtf 文档。我看到从表单输入的数据可以像“ form.username.dat a”一样访问。

username = StringField('Username')

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm(request.form)
    if request.method == 'POST' and form.validate():
        user = User(form.username.data)

        db_session.add(user)
        return redirect(url_for('login'))
    return render_template('register.html', form=form)

我的问题:

我的 qusetionair 表单有很多字段,必须输入 form.FIELDNAME.data 来获取每个字段的输入数据是不合逻辑的。我了解用户注册表单是可以接受的,因为只有大约 3-5 个字段。但是在我的场景(问卷形式)中,这并不理想

我试过的解决方案:

我将我的字段命名为 question_1 question_2 qusetion_3 ,然后创建了如下所示的一段时间以动态输入字段名称。但是,flask-wtf 抱怨“AttributeError: 'MyForm' object has no attribute 'question'”

if form.validate_on_submit():
    string = 'q'
    for i in range(30): 
        question = "q"+str(i)
        field_name = form.question.data
        answer_to_add = Answer(answers=field_name) 
        db.session.add(answer_to_add)
        db.session.commit() 

标签: pythonflaskwildcardflask-wtformswtforms

解决方案


对于将来遇到类似问题的人。解决方案是简单地使用“form.data”而不指定字段,因为这意味着所有字段都已发送。

代码示例:

if form.validate_on_submit():
   answer = form.data
   "do something"

您可以在文档中找到更多有用的信息:https ://wtforms.readthedocs.io/en/2.3.x/forms/?highlight=form#wtforms.form.Form.data


推荐阅读