首页 > 解决方案 > Flask + WTForms:一个函数提交按钮,用于n个迭代表单

问题描述

我正在尝试在我的网站中集成一个评分程序,并且正在努力获取输入(我是 Flask 新手)。

到目前为止发生了什么:

问题:

以下是详细信息:

表格如下所示:

class TestSpecForm(FlaskForm):
    key = StringField('Key', validators=[DataRequired(), NoneOf(' ')])      
    student_number = IntegerField('Number of Students', validators=[DataRequired()])
    submit = SubmitField('Submit')


class TestInputForm(FlaskForm):
    students = StringField('Student', validators=[DataRequired(), NoneOf(' ')])
    submit = SubmitField('Submit')

模型如下所示:

class Testspecs(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    key = db.Column(db.Text, nullable=False)  
    student_number = db.Column(db.Integer, nullable=False)


    def __repr__(self):     
        return f"Testspecs('{self.key}', '{self.student_number}', '{self.date_posted}')"


class S_Answers(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    s_answer = db.Column(db.Text, nullable=False)
    key_id = db.Column(db.Integer, db.ForeignKey('testspecs.id'), nullable=False)
    key = db.Column(db.Integer, db.ForeignKey('testspecs.key'), nullable=False)

我的视图/路线如下所示:

@app.route("/resources/testevaluation/<int:key_id>", methods=['GET', 'POST'])
def inpt(key_id):
    form = TestInputForm()
    key = Testspecs.query.get_or_404(key_id)
    if form.validate_on_submit():
        s_answers = S_Answers(s_answer=form.students.data, key_id=key.id) 
        db.session.add(s_answers)
        db.session.commit()
        flash('Your student answers have been posted and will be evaluated shortly.')
        return redirect(url_for('home'))
    return render_template('input.html', form=form, key=key, legend="Student Answers")

最后模板'input.html'看起来像这样:

{% extends "layout.html" %}
{% block content %}
<legend class="border-bottom mb-4">{{ legend }}</legend>
    {% for number in range(key.student_number) %}
<div class="content-section">
        <form method="POST" action="">
            {{ form.hidden_tag() }}
            <fieldset class="form-group">
                <div class="form-group">
                    {% if form.students.errors %}
                        {{ form.students(class="form-control form control-lg is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form.students.errors %}
                                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        Student {{ number + 1 }}
                        {{ form.students(class="form-control form control-lg") }}
                    {% endif %}
                </div>
            </fieldset>
        </form>
    </div>
    {% endfor %}
<div class="form-group">
    {{ form.submit(class="btn btn-outline-info") }}
    {% if form.submit %}
</div>
{% endblock content %}

哦,这就是网站的外观

我已经广泛搜索了类似的问题并找到了一些,但我仍然不知道该怎么做。我也尝试使用 FieldList(Formfields) 进行此操作,但我无法弄清楚如何获得 n=student_number 的字段数量 + 提交按钮在那里也不起作用。

有没有办法在这样的 n 个迭代字段上设置一个功能提交按钮?我将不胜感激任何和所有的帮助!

/edit 1: 如果我把 {% endfor %} 标签和提交按钮放在标签之前,我可以按提交按钮,但它给了我这个错误:

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL 约束失败:S__answers.key [SQL: 'INSERT INTO "S__answers" (s_answer, key_id, "key") VALUES (?, ?, ?)'] [参数: ('e', 14, None)](此错误的背景:http ://sqlalche.me/e/gkpj )

/edit 2:现在更新了我的 views/routes.py 文件,说“s_answers = S_Answers(s_answer=form.students.data, key_id=key.id, key=key.key)”导致错误消失。

然而,现在还有另一个问题:

我通过输入“一”、“二”和“三”作为学生答案来测试数据是否正确存储在数据库中。然后在 PowerShell 中查询 S_Answers.query.all() 的数据库,它只产生了这个:

[S_Answers('ABCDE', 'one')]  # "ABCDE" being the key

这意味着似乎只存储了循环的第一个实例。我怎样才能使循环中的所有表格都被存储?

标签: pythonwebflasksqlalchemywtforms

解决方案


推荐阅读