Form 验证之钩子

Form 验证之钩子

# From验证源码
def _clean_fields(self):
    for name, field in self.fields.items():
        # value_from_datadict() gets the data from the data dictionaries.
        # Each widget type knows how to retrieve its own data, because some
        # widgets split data over several HTML fields.
        if field.disabled:
            value = self.get_initial_for_field(field, name)
        else:
            value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
        try:
            if isinstance(field, FileField):
                initial = self.get_initial_for_field(field, name)
                value = field.clean(value, initial)
            else:
                value = field.clean(value)
            self.cleaned_data[name] = value
            if hasattr(self, 'clean_%s' % name):
                value = getattr(self, 'clean_%s' % name)()
                self.cleaned_data[name] = value
        except ValidationError as e:
            self.add_error(name, e)
  • 验证过程 每一个字段过来 先进行正则匹配,没有问题 然后 hasattr 检查是否存在该字段的函数,纯在就执行该函数。

  • 对注册 添加钩子:如果用户存在,着返回错误。
from app01 import models
from django.core.exceptions import ValidationError
class TestForm(Form):
    user = fields.CharField()
    pwd = fields.CharField()

    def clean_user(self):
        val = self.cleaned_data['user']
        if models.UserInfo.objects.filter(username=val).count():
            raise ValidationError('用户名已经存在!')
        else:
            return self.cleaned_data['user']
    def clean_pwd(self):
        return self.cleaned_data['pwd']

# From验证源码
    def full_clean(self):
        """
        Cleans all of self.data and populates self._errors and
        self.cleaned_data.
        """
        self._errors = ErrorDict()
        if not self.is_bound:  # Stop further processing.
            return
        self.cleaned_data = {}
        # If the form is permitted to be empty, and none of the form data has
        # changed from the initial data, short circuit any validation.
        if self.empty_permitted and not self.has_changed():
            return

        self._clean_fields()
        self._clean_form()
        self._post_clean()

    def _clean_form(self):
        try:
            cleaned_data = self.clean()
        except ValidationError as e:
            self.add_error(None, e)
        else:
            if cleaned_data is not None:
                self.cleaned_data = cleaned_data

   def clean(self):
    """
    Hook for doing any extra form-wide cleaning after Field.clean() has been
    called on every field. Any ValidationError raised by this method will
    not be associated with a particular field; it will have a special-case
    association with the field named '__all__'.
    """
    return self.cleaned_data

from app01 import models
from django.core.exceptions import ValidationError
class TestForm(Form):
    user = fields.CharField()
    pwd = fields.CharField()

    def clean_user(self):
        val = self.cleaned_data['user']
        if models.UserInfo.objects.filter(username=val).count():
            raise ValidationError('用户名已经存在!')
        else:
            return self.cleaned_data['user']
    def clean_pwd(self):

        return self.cleaned_data['pwd']

    def clean(self):
        # 这个时候cleaned_data里所有的值都获取到了,可以进行 比如用户名 密码的联合唯一操作
        user = self.cleaned_data.get('user')
        email = self.cleaned_data.get('email')
        if models.Student.objects.filter(user=user,email=email)
            raise ValidationError('用户名和邮箱已经联合已经存在!')
        else:
            return self.cleaned_data

  • 额外添加正则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-form验证报错TypeError: Cannot read properties of undefined (reading 'validate')通常是由于在Vue2工程中使用ElementUI表单(Form)的表单校验时出现的错误。这个错误通常是由于在表单校验之前没有正确地引入ElementUI的校验器validator导致的。解决这个问题的方法是在Vue组件中正确引入validator并在表单校验之前初始化它。 以下是一个解决el-form验证报错TypeError: Cannot read properties of undefined (reading 'validate')的例子: ```javascript <template> <el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="form.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('form')">提交</el-button> <el-button @click="resetForm('form')">重置</el-button> </el-form-item> </el-form> </template> <script> import { Validator } from 'element-ui' export default { data() { return { form: { username: '', password: '' }, rules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' } ] } } }, methods: { submitForm(formName) { this.$refs[formName].validate(valid => { if (valid) { alert('验证通过') } else { alert('验证失败') return false } }) }, resetForm(formName) { this.$refs[formName].resetFields() } }, mounted() { Validator.installDateTimeValidators(moment) } } </script> ``` 在这个例子中,我们首先从ElementUI中引入了Validator,然后在Vue组件的mounted钩子函数中初始化了Validator。这样就可以在表单校验之前正确地使用Validator了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值