python - Flask + WTForms:一个函数提交按钮,用于n个迭代表单
问题描述
我正在尝试在我的网站中集成一个评分程序,并且正在努力获取输入(我是 Flask 新手)。
到目前为止发生了什么:
我以 TestSpecForm 的形式向用户询问参与测试的学生人数(和密钥)(student_number)
一个页面加载迭代这个 student_number 并给我一个 n=student_number 数量的 StringFields,我可以在其中输入学生的测试成绩(这个表格是 TestInputForm)
有一个提交按钮
问题:
- 提交按钮不起作用(当我点击它时,目前什么都不做)
以下是详细信息:
表格如下所示:
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
这意味着似乎只存储了循环的第一个实例。我怎样才能使循环中的所有表格都被存储?
解决方案
推荐阅读
- json - 使用 GSON 将 json 字符串转换为特定类的问题
- paypal - 如何使用 SDK 设置 PayPal 交易类型?
- flutter - 在 Flutter 中使用 Imager Picker 依赖项
- embedded-linux - Yocto - 只读 rootfs - 无法在 .hddimg 上重新挂载为 RW
- r - ggplot:如何从 facet_wrap 中删除空组?
- sql - 尝试创建存储过程 db2 时出错
- php - 如何显示blade.php 文件列表但省略扩展名?
- sql - SQL SUM 直到条件
- python - 在文本文件python中对齐多个函数
- python-3.x - 用户输入和条件语句以及代码执行延迟和循环