社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  问与答

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

gengshenghong2007 • 8 年前 • 3087 次点击  

举例吧,比如一个表单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
 
3087 次点击  
文章 [ 5 ]  |  最新文章 8 年前
MCC
Reply   •   1 楼
MCC    8 年前

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

SomeThing
Reply   •   2 楼
SomeThing    8 年前

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

gengshenghong2007
Reply   •   3 楼
gengshenghong2007    8 年前

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

MCC
Reply   •   4 楼
MCC    8 年前

错别字 前段-》前端

MCC
Reply   •   5 楼
MCC    8 年前

重写 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就行了