客户端部分生成表单时如何进行Flask WTForms表单验证

文森特31337

我正在构建一个带有两个下拉菜单的简单用户界面。根据第一个下拉菜单中选择的内容,第二个下拉菜单通过jquery / AJAX填充了一些新值。问题在于,提交表单后,表单验证正确地失败了,因为返回的第二个下拉列表中的选项不在生成该下拉列表的列表中。

我通过在验证表单之前将从下拉列表2发送的所有数据注入到表单对象中来使其工作。这段代码如下所示,但感觉像是一个hacky解决方案。

form = SearchForm(request.form)

# dropdown 1
form.node_type.choices = [('default', 'Please select a node type')]
form.node_type.choices.extend([(t, t) for t in node_types()])

# dropdown 2
form.node_name.choices = [('default', 'Select a node type first')]

if request.method == 'POST':
    # the below 2 lines are the hack that make it work.
    node_name = request.form.get('node_name')
    form.node_name.choices.append((node_name, node_name))

    if form.validate():
        print('hooray')

是否有一种标准/推荐的方法可以在客户端动态添加选项,并且仍然让WTForms正确执行表单验证?

蛇魅

这是纯wtforms解决方案,但应与flask-wtf(form.validate()在内调用flask-wtf form.validate_on_submit())一起使用。

Form.validate如果该node_name字段的验证失败并显示“无效选择”错误,则代码将扩展为调用自定义验证函数如果验证函数返回,True它将消除“无效选择”错误,Form.errors并返回TrueifForm.errors现在为空。

import werkzeug
import wtforms


class Form(wtforms.Form):

    node_type = wtforms.SelectField(choices=[(x, x) for x in 'ABCDEF'])
    node_name = wtforms.SelectField(choices=[('', '')])

    def validate(self):
        if super().validate():
            return True
        invalid_choice = 'Not a valid choice'
        if 'node_name' in self.errors and invalid_choice in self.errors['node_name']:
            is_valid_node_name = self.cross_validate_node_name()
            if is_valid_node_name:
                self.errors['node_name'].remove(invalid_choice)
                if not self.errors['node_name']:
                    del self.errors['node_name']
                return not self.errors
        return False

    def cross_validate_node_name(self):
        # Implement your validation logic here.
        return self.node_type.data == 'B' and self.node_name.data == 'spam'


if __name__ == '__main__':
    datas = [werkzeug.MultiDict([('node_type', 'A'), ('node_name', 'spam')]),
             werkzeug.MultiDict([('node_type', 'B'), ('node_name', 'spam')])]
    for data in datas:
        form = Form(formdata=data)
        if form.validate():
            print('OK')
        else:
            print(form.errors)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

WTForms RadioField阻止表单验证

表单部分的客户端验证

使用Flask wtforms验证器而不使用表单

客户端表单验证

客户端验证和客户端表单验证

客户端验证和客户端表单验证

使用Vue 2进行客户端表单验证

Flask WTForms-基于多个表单字段的自定义验证器

客户端表单验证栏

如何让ActiveAdmin在客户端的表单上执行输入验证?

WTForms的默认表单大小

从WTForms表单获取数据

如何在PHP / HTML中进行客户端表单数据验证

WTForms:取消时禁用客户端验证

使用Flask / WTForms的多部分表单

JHIpster前端如何进行表单验证?

使用Flask-WTForms,如何设置html的表单部分的样式?

使用jQuery成功进行客户端验证后,如何提交html表单以进行服务器端验证?

通过AJAX提交表单,但保持客户端验证

Yii2客户端表单验证

信用卡表单的客户端验证

在Flask的WTForms中验证DecimalRangeField

在 JSF 中提交表单之前使用 JS 进行客户端验证

如何在客户端的表单视图中使用 Google 表单进行操作

Flask,MongoEngine,WTForms-表单呈现错误

在MVC中进行表单发布时,客户端数据将如何反序列化为模型类

提交时如何验证Flask表单?

JS客户端表单验证-当通过eventListener的“提交”事件的formValidation函数返回false时,表单仍会提交

HTML5:我是否需要同时在客户端和服务器端验证Web表单,还是可以只在客户端进行验证?