Django --form验证

formOoject.is_valid()调用如下方法:

return self.is_bound and not self.error

其中is_bound可以认为是否是有传入(绑定) 重点是self.error进入这个方法‘
1     @property
2     def errors(self):
3         "Returns an ErrorDict for the data provided for the form"
4         if self._errors is None:
5             self.full_clean()
6         return self._errors

从第5行得知,这个方法的核心是full_clean(),查看他的方法:

 1  def full_clean(self):
 2         """
 3         Cleans all of self.data and populates self._errors and
 4         self.cleaned_data.
 5         """
 6         self._errors = ErrorDict()
 7         if not self.is_bound:  # Stop further processing.
 8             return
 9         self.cleaned_data = {}
10         # If the form is permitted to be empty, and none of the form data has
11         # changed from the initial data, short circuit any validation.
12         if self.empty_permitted and not self.has_changed():
13             return
14
15 self._clean_fields()
16 self._clean_form()
17         self._post_clean()

重点在于15,16,17行

首先查看15行的实现:

 1     def _clean_fields(self):
 2         for name, field in self.fields.items():
 3             # value_from_datadict() gets the data from the data dictionaries.
 4             # Each widget type knows how to retrieve its own data, because some
 5             # widgets split data over several HTML fields.
 6             if field.disabled:
 7                 value = self.get_initial_for_field(field, name)
 8             else:
 9                 value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
10             try:
11                 if isinstance(field, FileField):
12                     initial = self.get_initial_for_field(field, name)
13                     value = field.clean(value, initial)
14                 else:
15                     value = field.clean(value)
16                 self.cleaned_data[name] = value
17                 if hasattr(self, ‘clean_%s‘ % name):
18                     value = getattr(self, ‘clean_%s‘ % name)()
19                     self.cleaned_data[name] = value
20             except ValidationError as e:
21                 self.add_error(name, e)注意17,18行;这里提供了一个钩子.既  clean_字段 ,这里通过反射的形式进行调用

接下来是16行:

1     def _clean_form(self):
2         try:
3             cleaned_data = self.clean()
4         except ValidationError as e:
5             self.add_error(None, e)
6         else:
7             if cleaned_data is not None:
8                 self.cleaned_data = cleaned_data这里,第3行调用了钩子,我们可以覆写这个方法

最后是17行:

1     def _post_clean(self):
2         """
3         An internal hook for performing additional cleaning after form cleaning
4         is complete. Used for model validation in model forms.
5         """
6         pass钩子

原文地址:https://www.cnblogs.com/ywhyme/p/8645825.html

时间: 2024-07-28 21:57:44

Django --form验证的相关文章

关于django form验证是否用户名已存在

想通过django的Form模块进行数据库中是否已存在用户名的验证,首先我先调用了数据库用户名字段所有的值,发现是个queryset对象. 随后经过查询后发现queryset查询集对象可以调用list工厂方法后,生成一个类似于[('user_name_1','username_2')]的对象,随即把列表中的元组对象拿出来进行遍历,完成验证,form代码如下: class Registerform(forms.Form): user_name = forms.CharField(label='你的

Django form验证二

63-05 必须先判断is_valid(),才能获取值.clean() 创建form对象时,从数据库取值初始化: username = fields.CharField() user_type = fields.IntegerField( widget=widgets.Select(choices=[]) ) def __init__(self,*args, **kwargs): # 执行父类的构造方法 super(InitialForm,self).__init__(*args, **kwar

[oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息

form后台生成form里面的Input标签,以及设置Input的属性 # 需求 后台生成form里面的input标签,并设置input标签的属性, class RegisterForm(Form): email = fields.EmailField() password = fields.CharField() password2 = fields.CharField() code = fields.CharField() avatar = fields.FileField(widget=w

Django中Form验证

Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一,Form验证 第一种操作:主要是这三个函数 is_valid() cleaned_data errors from xiaoqing import models def form(request): if request.method == "GET": return render(request,'form.html') eli

django 使用form验证用户名和密码

form验证可以减少查询数据库,所以代码先预先验证,有问题可以返回给前端显示 1.在users文件夹下新建forms.py文件,用来验证用户名和密码是否为空,密码长度是否大于6 # -*- coding: utf-8 -*- # 作者:神秘藏宝室 # 日期:2018/12/30 21:56 from django import forms class LoginForm(forms.Form): username = forms.CharField(required=True) password

Django之Form验证(***)

Django之Form验证 ------- END ------- 原文地址:https://www.cnblogs.com/george92/p/11441796.html

Django—Form两种保留用户提交数据的方法

用户在网页上进行表单填写时,有可能出现某项填写错误.一般情况下,用户在未发觉错误的情况下点击提交,则此表单的内容会清空,用户不得不再重新填写,这样的用户体验是及其糟糕的. 在此,我们有2种方法将用户的输入保存下来,一旦填写错误,只需要将错误项修改即可重新提交. 一.利用Form生成Html标签 1. views.py 1 from django.shortcuts import render, HttpResponse, redirect 2 from django.forms import F

Django Form表单

Django  Form 表单 在实际的生产环境中比如登录和验证的时候,我们一般都使用Jquery+ajax来判断用户的输入是否为空,假如JS被禁用的话,咱们这个认证屏障是不是就消失了呢?(虽然一般不会禁用掉但是还是存在风险) 所以我们一般做两种认证一种是前端做一遍认证,在后端做一遍认证. 首先咱们看一下下面的案例: from django.shortcuts import render # Create your views here. def user_list(request): host

Django ==> Form 组件

Django ==> Form 组件 目录: 1.基本使用 2.form中字段和插件 3.自定义验证规则 4.动态加载数据到form中 Action: 1.基本使用 django 中的Form组件有一下功能: 1.生成html标签 2.验证用户数据(显示错误信息) 3.html form 提交保留上次提交数据 4.初始化页面显示内容 要使用 form 类,首先需要创建这个类,方法如下: from django.forms import Form from django.forms import