一、说明Django
中的表单与HTML
中的表单不是一个东西
二、Django
中的表单是对HTML
中表单提交过来的数据进一步的校正,使用步骤
- 1、在组件(
App
)目录下创建一个forms.py
的文件 2、在文件中创建表单相关的类(下面错误
error_messages
提示是自己定义的)注意在
forms.py
里面定义的变量要与form
表单中的name
一致from django import forms class RegisterForms(forms.Form): username = forms.CharField(required=True, max_length=10, min_length=3,error_messages={'required': u'必填字段', 'max_length': u'长度超过10位', 'min_length': u'长度太短'}) password = forms.CharField(required=True, error_messages={'required': u'必填字段'})
3、使用创建的
RegisterForms
def register(request): if request.method == "GET": return render(request, 'register.html') else: form = RegisterForms(request.POST) # 通过forms验证数据的合法性 if form.is_valid(): return HttpResponse(u'注册成功') else: return HttpResponse(u'注册失败')
4、把错误返回到前端页面(利用
form.errors
)def register(request): if request.method == "GET": return render(request, 'register.html') else: form = RegisterForms(request.POST) # 通过forms验证数据的合法性 if form.is_valid(): return HttpResponse(u'注册成功') else: return render(request, 'register.html', {'errors': form.errors})
5、把错误状态以
json
格式返回到前端页面return render(request, 'register.html', {'errors': form.errors.as_json()})
6、使用
cleaned_data
拿取数据保存到数据库cleaned_data
这个是在is_valid()
返回true
的时候,可以通过get
获取到干净的数据def register(request): if request.method == "GET": return render(request, 'register.html') elif request.method == "POST": form = RegisterForms(request.POST) # 通过forms验证数据的合法性 if form.is_valid(): # 验证合法性后从cleaned_data.get()获取输入的值 username = form.cleaned_data.get('username', None) password = form.cleaned_data.get('password', None) userModel = UserModel(username=username, password=password) userModel.save() return HttpResponse(u'注册成功') else: return render(request, 'register.html', {'errors': form.errors.as_json()}) else: return HttpResponse(u'不被处理的请求')
三、表单中常见的Field
(有点类似Models.py
里面一样)
- 1、
CharField
表示一个字符的,可以传递required
,max_length
,min_length
参数 - 2、
BooleanField
一般用户复选框的,传入参数required=False
因为不是必选的 - 3、
DateField
用来验证输入时间 - 4、
EmailField
用户输入邮箱 - 5、
FloatField
用来验证是否为浮点型 - 6、
IntegerField
用来验证是否为整数 - 7、
URLField
用来验证URL
- 8、
FileField
用来验证是否为文件,传入max_length
表示文件名长度 - 9、
ImageField
验证是否为图片,需要先按照pillow
四、上传文件的步骤
1、在数据库定义一个字段
# 新增头像的 avatar = models.CharField(max_length=100, null=True)
2、在
forms.py
里面定义一个字段验证# 注意这个地方要加上upload_to='',这样文件才可以上传到指定目录下 avatar = forms.FileField(max_length=100,upload_to='',)
3、生成数据库文件
- 4、在项目的根目录下创建一个用来上传图片的文件夹
5、在
settings.py
中配置指定到该目录下# 配置文件上传存放路径 MEDIA_ROOT = 'files'
6、在
form
表单中设置enctype="multipart/form-data"
- 7、在
view
中使用form = RegisterForms(request.POST, request.FILES)
接收上传文件 - 8、将文件名保存到数据库
五、自定义表单验证器
- 1、在表单中,重写一个方法
clean_fieldname
,如果出现错误旧抛出ValidationError
错误 2、判断没问题要返回去
class RegisterForms(forms.Form): ... password = forms.CharField(required=True, error_messages={'required': u'必填字段'}) avatar = forms.FileField(max_length=100) # 自定义验证器 def clean_password(self): password = self.cleaned_data.get('password', None) if len(password) < 3: raise forms.ValidationError(u'密码长度过短', code='min_length') return password
3、全局验证,多个字段一起验证(常见密码验证)
# 定义全局的验证 def clean(self): super(RegisterForms,self).clean() cleaned_data = self.cleaned_data password = cleaned_data.get('password', None) password_rep = cleaned_data.get('password_rep', None) if password != password_rep: raise forms.ValidationError(u'两次密码不一致',code='equal') return cleaned_data
4、如果在字段中添加错误
... if password != password_rep: # raise forms.ValidationError(u'两次密码不一致',code='equal') self.add_error('password', '密码不一致') return cleaned_data ...