【问题标题】:Create multiple input elements using single class in WTForms (Flask)在 WTForms (Flask) 中使用单个类创建多个输入元素
【发布时间】:2020-11-18 15:08:20
【问题描述】:

我正在 Flask 中制作一个 Web 应用程序来生成要导入 Excel 的 XML。该网络应用程序有一个表格,其中有 15 个问题、4 个问题选项、正确答案和一个计时器。

这是我使用 WTForms 的forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, SelectField, IntegerField, SubmitField
from wtforms.validators import DataRequired, Length

class XMLQuestionForm(FlaskForm):
    question = StringField('Question', validators=[DataRequired(), Length(max=395)])
    optionA = StringField('Option A', validators=[DataRequired(), Length(max=85)])
    optionB = StringField('Option B', validators=[DataRequired(), Length(max=85)])
    optionC = StringField('Option C', validators=[DataRequired(), Length(max=85)])
    optionD = StringField('Option D', validators=[DataRequired(), Length(max=85)])
    answer = SelectField('Answer', validators=[DataRequired()], choices=[('Option A','Option B','Option C','Option D')])
    timer = IntegerField('Timer', default=60)

现在,我想创建一个 HTML 文件,其中可以输入和提交 15 个不同的问题、选项和答案。提交后我会在routes.py处理

这是我的routes.py

from flask import render_template, url_for, flash, redirect
from myflaskapp import app

@app.route("/")
@app.route("/home",)
def home():
    form = XMLQuestionForm()
    if form.validate_on_submit():
        #Do something
    else:
        flash('ERROR MESSAGE', 'danger')
    return render_template('home.html', title='Questions XML Form', form=form)

我想拥有上面提到的 15 个这样的字段,而不必创建多个表单类变量。

我该怎么做?

【问题讨论】:

    标签: python python-3.x flask flask-wtforms wtforms


    【解决方案1】:

    我将保留对这种方法的效率或适当性的判断,但这样做可能是一种工厂功能:

    def create_form(input):
        class Form(FlaskForm):
            timer = IntegerField('Timer', default=60)
    
        kwargs = {'validators': [DataRequired(), Length(max=85)]}
        for i, vals in enumerate(input):
            setattr(Form, 'questn_' + str(i), StringField(vals[0], **kwargs))
            setattr(Form, 'answer_' + str(i), StringField(vals[1], **kwargs))
            for j, opt in enumerate(vals[2]):
                setattr(Form, 'opt_' + str(i) + str(j), StringField(opt, **kwargs))
        
        return Form
    
    Form = create_form([
        ['Question1', 'Answer1', ['OptA', 'OptB', 'OptC']],
        ['Question2', 'Answer2', ['OptX', 'OptY']]
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多