Py学习  »  问与答

is_valid如何每次遇到错误字段停止验证其他字段?

gengshenghong2007 • 10 年前 • 4195 次点击  

举例吧,比如一个表单username和password登录,都是required。template里面:{{ form }} 这样的。假设什么都不写就提交,那么is_valid会进行验证,出错一般就是下面这样了: username: (输入框) this field is required. password: (输入框) this field is required.

有没有办法,在验证username已经不符合要求就不要去验证password了?显示如下: username: (输入框) this field is required. password: (输入框)

但是并不是不验证password,如果username输入了,那么就会显示如下: username: (输入框)
password: (输入框) this field is required.

应该很好理解吧。很多网站不都是这样的吗,特别假设一个页面很多输入框,每次验证那么多字段一是没必要,二是错误消息太多了点。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/1256
文章 [ 5 ]  |  最新文章 10 年前
MCC
Reply   •   1 楼
MCC    10 年前

后端提交数据肯定是要检验的,但是比较灵活的验证前端要先来一步。比如输入一个值,leave forcus的时候就对后端发请求验证(身份证是否合法,用户名是否重复,等等),像括号里面的这种验证难道用django form的is_valid来做。。。。不如自己另写method来处理

SomeThing
Reply   •   2 楼
SomeThing    10 年前

这样的验证应该是在前端来进行的话! 个人感觉……

gengshenghong2007
Reply   •   3 楼
gengshenghong2007    10 年前

谢谢回复。改django代码是一种方法,不知道有没有某个设置可以做到,看来是没有。 感觉不个性化啊,我也是感觉很多网站都是这样的行为,所以想一下django为什么会一次验证所有的。前端写太多了,而且仅仅依靠前端的验证几乎没什么用,很容易禁止。

MCC
Reply   •   4 楼
MCC    10 年前

错别字 前段-》前端

MCC
Reply   •   5 楼
MCC    10 年前

重写 https://github.com/django/django/blob/master/django/forms/forms.py L 375

 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.initial.get(name, field.initial)
            else:
                value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
            try:
                if isinstance(field, FileField):
                    initial = self.initial.get(name, field.initial)
                    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)

这个for直接让它不循环╮(╯▽╰)╭

其实那么个性化的要求,何必一定要用django的form,自己写前段的form然后用html5/js去valid就行了