Flask + WTForms: одна кнопка отправки функции для n-го числа повторяющихся форм - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь интегрировать программу оценки на моем веб-сайте и пытаюсь получить информацию (я новичок в 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

Это означает, что только самый первый экземплярцикла кажется сохраненным.Как сделать так, чтобы все формы в цикле сохранялись?

...