表格和字段验证

当调用方法"is_valid()"时会进行表单验证。如果要自定义此过程,可以进行各种更改,每个更改用于不同的目的。在表格处理期间运行三种类型的cleaning方法。这些通常在"is_valid()"在表单上调用方法时执行。

通常来说,如果数据有错的话,任何cleaning方法都可以触发 ValidationError;如果数据没问题,那么该方法会把cleaned后的数据转化为Python object返回。

表单的验证分为几个步骤,可以自定义或覆盖:

1、Field上的to_python()方法是每次验证的第一步。

它将值强制转换为正确的数据类型,如果不可能,则引发ValidationError。此方法接受窗口小部件的原始值并返回转换后的值。例如,FloatField会将数据转换为Python float或引发ValidationError。 Field上的validate()方法处理不适合验证器的特定于字段的验证。它需要一个已被强制转换为正确数据类型的值,并在任何错误上引发ValidationError。此方法不返回任何内容,不应更改该值。您应该覆盖它以处理您不能或不想放入验证器的验证逻辑。

2、Field上的run_validators()方法运行所有字段的验证器,并将所有错误聚合到单个ValidationError中

您不应该重写此方法。 Field子类上的clean()方法负责以正确的顺序运行to_python(),validate()和run_validators()并传播它们的错误。如果在任何时候,任何方法引发ValidationError,则验证将停止并引发该错误。此方法返回干净数据,然后将其插入到表单的cleaning_data字典中。 在表单子类上调用clean_ <fieldname>()方法 - 其中<fieldname>替换为表单字段属性的名称。此方法执行特定于该特定属性的任何清理,与其所在的字段类型无关。此方法未传递任何参数。您需要在self.cleaned_data中查找该字段的值,并记住此时它将是一个Python对象,而不是表单中提交的原始字符串(它将在cleaning_data中,因为一般字段clean()方法,上面,已经清理过一次数据)。 例如,如果要验证名为serialnumber的CharField的内容是否唯一,则clean_serialnumber()将是执行此操作的正确位置。您不需要特定字段(它只是一个CharField),但您需要特定于表单字段的验证,并且可能需要清理/规范化数据。 此方法的返回值将替换cleaning_data中的现有值,因此它必须是来自cleaning_data的字段值(即使此方法未更改它)或新清除的值。

3、表单子类的clean()方法可以执行需要访问多个表单字段的验证。

您可以在此处进行检查,例如“如果提供了字段A,则字段B必须包含有效的电子邮件地址”。如果愿意,此方法可以返回完全不同的字典,该字典将用作cleaning_data。 由于在调用clean()时运行了字段验证方法,因此您还可以访问表单的errors属性,该属性包含清除单个字段引起的所有错误。 请注意,Form.clean()覆盖引发的任何错误都不会与任何字段相关联。它们进入一个特殊的“字段”(称为__all__),如果需要,可以通过non_field_errors()方法访问它。如果要将错误附加到表单中的特定字段,则需要调用add_error()。 另请注意,重写ModelForm子类的clean()方法时需要特别注意。 这些方法按上面给出的顺序运行,一次一个字段。也就是说,对于表单中的每个字段(按照它们在表单定义中声明的顺序),运行Field.clean()方法(或其覆盖),然后运行clean_ <fieldname>()。最后,一旦为每个字段运行这两个方法,无论先前的方法是否引发了错误,都会执行Form.clean()方法或其覆盖。 以下提供这些方法中的每一种的实例。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/linyuhong/p/9493377.html

如果你需要判断表格中某个字段是否为空,可以在 `rules` 中使用自定义校验函数来实现。例如: ```html <template> <el-form :model="form" :rules="rules"> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"> <template slot-scope="scope"> <el-input v-model="scope.row.age" @blur="validateAge(scope.row, scope.$index)" /> </template> </el-table-column> </el-table> </el-form> </template> <script> export default { data() { return { form: { tableData: [{ name: '', age: '' }] }, rules: { tableData: [ { validator: this.validateTableData, trigger: 'blur' } ] } } }, methods: { validateTableData(rule, value, callback) { for (let i = 0; i < value.length; i++) { if (!value[i].age) { return callback(new Error('年龄不能为空')) } } callback() }, validateAge(row, index) { if (!row.age) { this.$set(this.form.tableData[index], 'age', '') } } } } </script> ``` 在上面的例子中,我们在 `el-table-column` 中使用了 `template` 来自定义表格中 `age` 字段的输入框,并在输入框的 `blur` 事件中调用了 `validateAge` 方法,用于处理输入框中的值为空的情况。同时,在 `rules` 中使用了自定义校验函数 `validateTableData`,该函数会遍历表格数据中的每个单元格,如果某个单元格的 `age` 值为空,则返回一个错误信息,否则返回验证通过的信息。这样,当表格中的 `age` 字段有为空的情况时,就会触发验证失败,提示 `年龄不能为空` 的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值