Flask WTForms не собирают информацию из полей - PullRequest
0 голосов
/ 28 мая 2020

Я использую Flask WTForms для отправки формы, содержащей информацию о новом школьном предмете. Запрос POST выполняется, но он не захватывает информацию из полей формы.

Я получаю это сообщение в своем терминале:

ERROR:  (psycopg2.errors.NotNullViolation) null value in column "grade" violates not-null constraint
DETAIL:  Failing row contains (15, , null).

[SQL: INSERT INTO subjects (name, grade) VALUES (%(name)s, %(grade)s) RETURNING subjects.id]
[parameters: {'name': '', 'grade': None}]
(Background on this error at: http://sqlalche.me/e/gkpj)
127.0.0.1 - - [28/May/2020 11:57:29] "POST /api/subjects/create HTTP/1.1" 422 -

Мои запросы CURL также возвращают пустые поля данных. Было бы лучше присоединиться к конечным точкам запросов GET и POST для создания новой темы? Я разделил запрос POST на отдельную конечную точку, обрабатывающую запросы для использования API, а GET - для внешнего интерфейса.

app.py

@app.route('/api/subjects/create', methods=['POST'])
    # @requires_auth('post:subjects')
    def create_subject_api():
        '''
        Handles API POST requests for creating new subject. Returns JSON.
        '''
        body = request.get_json()
        form = SubjectForm(request.form)

        name = form.name.data
        grade = form.grade.data

        subject = Subject(
                name=name, grade=grade
            )

        try:
            subject.insert()
            redirect(create_subject_api)

        except Exception as e:
            print('ERROR: ', str(e))
            abort(422)

        flash(f'{subject.grade}:{subject.name} successfully created!')

        return jsonify({
            'success': True,
            'subject': subject.format()
        })

forms.py

class SubjectForm(FlaskForm):
    name = StringField(
        'Name', [DataRequired()]
    )
    grade = SelectField(
        'Grade', [DataRequired()],
        coerce=int, choices=[
            ('7', '7'),
            ('8', '8'),
            ('9', '9'),
            ('10', '10'),
            ('11', '11'),
            ('12', '12')
        ])

new_subject. html

{% extends "base.html" %}
{% block content %}
<div class="container">
    <h1>New Subject</h1>
    <form action="/" method="post">
        <h3 class="form-heading">List a new subject</h3>
        <div class="form-field">
          <label for="name">Name</label>
          {{ form.name.label }} {{ form.name(size=20) }}
        </div>
        <div class="form-field">
            <label for="grade">Grade</label>
            {{ form.grade.label }} {{ form.grade }}
        </div>
        <button type="button" value="Create Subject" class="btn btn-primary btn-lg btn-block" onclick="submitSubject()">
            Submit</button>

    </form>
</div>
    <script>

        function submitSubject() {
            let name = document.getElementById("name");
            let grade = document.getElementById("grade");

            let data = {
                "name": name,
                "grade": grade
            }

            fetch(`${window.location.origin}/api/subjects/create`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(data),
            })
                .then((response) => {
                    return response.json();
                })
                .then((myJson) => {
                    if (myJson['success'] == true) {
                        window.location.href = '/subjects';
                    }
                });

        }

    </script>
{% endblock %}

1 Ответ

0 голосов
/ 28 мая 2020

Не могу комментировать, напишу как ответ, что произойдет, если вы попытаетесь распечатать данные об оценке и имени перед созданием объекта базы данных

Вы можете попробовать изменить кнопку отправки на :

<input type="submit" value="Create Subject">

Кажется, что форма либо не проходит валидацию, либо не отправляется

Один из способов проверить, прошла ли она валидацию, - это проверить, проходит ли она

If form.validate_on_submit()
...