【问题标题】:Flask WTForms not capturing information from fieldsFlask WTForms 未从字段中捕获信息
【发布时间】:2020-05-28 10:10:19
【问题描述】:

我正在使用 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 %}

【问题讨论】:

    标签: python flask jinja2 flask-sqlalchemy flask-wtforms


    【解决方案1】:

    无法评论,我将其写为答案,如果您在创建数据库对象之前尝试打印放置您的等级和姓名数据会发生什么

    您可以尝试将提交按钮更改为:

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

    看起来表单要么没有通过验证,要么没有提交

    检查它是否已验证的一种方法是查看它是否通过

    If form.validate_on_submit()
    

    【讨论】:

    • 没有出现
    • 好的,试着把按钮改成这样:
    • 谢谢,已经尝试了所有这些,现在由于提交按钮未重定向到 /api/subjects/create ,因此出现 405 错误
    • 哦,如果与以前相比,您唯一改变的只是将类型从按钮更改为提交,会发生什么?
    • 抱歉没能帮上忙。
    猜你喜欢
    • 2023-03-14
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多