Я пытаюсь интегрировать программу оценки на моем веб-сайте и пытаюсь получить информацию (я новичок в Flask).
Что происходит до сих пор:
Я спрашиваю пользователя о количестве студентов, участвующих (и ключа) в тесте (student_number)) в форме TestSpecForm
Загружается страница, которая перебирает этот номер student_number и дает мне количество StringFields n = student_number, в которое я могу ввести результаты тестов студентов (эта форма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")
и, наконец, template '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 %}
Oh и так выглядит сайт
I 'мы ищемОн нашел повод для подобных проблем и нашел некоторые, но я все еще не мог понять, что делать.Я также пытался сделать это с 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")ЗНАЧЕНИЯ (?,?,?) '] [Параметры: (' e ', 14, нет)] (фон этой ошибки: http://sqlalche.me/e/gkpj)
/ edit 2 : естьтеперь обновил мой файл views / rout.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
Это означает, что только самый первый экземплярцикла кажется сохраненным.Как сделать так, чтобы все формы в цикле сохранялись?