javascript - WTForms Ajax 验证失败

标签 javascript python ajax wtforms

我正在用 Python 构建我的第一个 Web 应用程序,并使应用程序更加动态。

只要用户填写正确的数据,代码就可以正常工作。但是,我现在正在测试一些错误的输入,并且它失败了。 我正在使用 WTForms,在构建非 ajax 页面时一切正常,当用户在其中输入错误数据时,应用程序给前端一个很好的“无效输入”。 现在应用程序中断了。

这是表格:

class ExpenseForm(FlaskForm):
    list_id = HiddenField(validators=[DataRequired()])
    title = StringField('Expense', validators=[DataRequired()])
    expensetype_id = SelectField('Expense Type', coerce=int)
    price = DecimalField('Cost', places=2, validators=[DataRequired()])
    quantity = IntegerField('Quantity', validators=[DataRequired()])
    currency_id = SelectField('Currency', coerce=int)
    country_id = SelectField('Country', coerce=int)
    city = StringField('City', validators=[DataRequired()])
    date = DateField('Date', validators=[DataRequired()])
    exceptional_cost = BooleanField('Exceptional cost')
    submit = SubmitField('Add')

我的路线:

@bp.route('/commit_expense', methods=['POST'])
@login_required
def commit_expense():
    form = ExpenseForm()
    form.expensetype_id.choices = [(et.id, et.name) for et in Expensetype.query.order_by('name')]
    form.currency_id.choices = [(c.id, c.short) for c in Currency.query.order_by('short')]
    form.country_id.choices = [(co.id, co.name) for co in Country.query.order_by('name')]
    print(form.data)
    if form.validate_on_submit():
        extra_add_expense(form)
        return jsonify({'success': 'Expense added'})
    return jsonify({'error':'Failed to add expense',
                        'form_errors':[{form[field].label: ', '.join(errors)} for field, errors in form.errors.items()]})

和 javascript:

$(function () {
    $("#expense_form").submit(function (event) {
        event.preventDefault(); // Prevent the form from submitting via the browser
        var form = $(this);
        var error_div = $("#form_errors");
        $(error_div).children().remove();
        $.ajax({
            type: form.attr('method'),
            url: form.attr('action'),
            data: form.serialize()
        }).done(function (data) {
            if (data.error) {
                for (item in data.form_errors) {
                    Object.keys(data.form_errors[item]).forEach(function (key) {
                        $('<p>').text(key + ': ' + data.form_errors[item][key]).addClass("show_error").appendTo(error_div);
                    });
                };
            } else {
                form[0].reset();
                daily_refresh();
            }
        }).fail(function (data) {
            // Finish fail here
        });
    });
});

所以只要我在所有字段中填写正确的信息,一切都会按预期进行,但是当我填写一些错误的信息时,例如价格,我会得到这个:

TypeError: key Label('price', 'Cost') is not a string

示例 json 消息是:

list_id=2&csrf_token=IjA0NGJjNzU1Nzg3ODg1ZjhhODQ0YzE5ODMwYzkzZTBkNjEyMWQyYjIi.Du1lBg.nJJpKiNSV4pnCLsIfzUaqlsmscg&title=ff&expensetype_id=1&price=f&quantity=1&currency_id=2&city=GHanzhaou&country_id=5&date=2018-12-08

然后我从 print(form.data) 中得到以下数据:

{'list_id': '2', 'title': 'ff', 'expensetype_id': 1, 'price': None, 'quantity': 1, 'currency_id': 2, 'country_id': 5, 'city': 'GHanzhaou', 'date': datetime.date(2018, 12, 8), 'exceptional_cost': False, 'submit': False, 'csrf_token': 'IjA0NGJjNzU1Nzg3ODg1ZjhhODQ0YzE5ODMwYzkzZTBkNjEyMWQyYjIi.Du1lBg.nJJpKiNSV4pnCLsIfzUaqlsmscg'}

现在我已经针对我的其他非 ajax 函数对此进行了测试,当数据不正确时(例如使用其他 DecimalFields),它们似乎也有一个“无”。 在验证时,它们只返回“DataRequired”错误,页面会处理显示。

我不太明白失败背后的原因。 非常感谢任何帮助或见解。

提前致谢!

最佳答案

form[field].label 是一个 Label 实例,不是字符串。

使用 form[field].label.text 获取标签的字符串表示形式。

你的 View 的最后一行应该是

 return jsonify({'error':'Failed to add expense',
                 'form_errors':[{form[field].label.text: ', '.join(errors)} for field, errors in form.errors.items()]})

关于javascript - WTForms Ajax 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53683742/

相关文章:

javascript - 在 AngularJS 中提取 json 对象中的对应值

javascript - 如何删除 _id 属性?

python - 输入层的 TensorFlow Keras 维度误差

JavaScript、Jquery 代码笔

javascript - Meteor 服务器在 Meteor 方法中使用 Accounts.addEmail() 抛出错误

javascript - 使用 call 或 apply 调用闭包中的函数?

Python Turtle对角线长度错误?

jquery - 在 Python 中抛出异常并在 jQuery 中读取消息

javascript - 响应值在 ajax 中重叠

javascript - 在Ajax中如何将html页面中的国家名称传递到php页面?