forms组件
上周内容补充:
前后端数据传输的编码格式:
1.urlencoded
2.formdata
3.appliation/json
web中的请求过程中http格式的form请求基本包含:
请求首行 POST HTTP/1.1
请求头(k:v键值对)
标识编码:编码格式
请求体
form表单默认的编码格式是 urlencoded 不支持 发文件(只能把文件名发送过去)
form表单所对应的数据格式 例如: username=jason&password=123
request.POST只能解析 urlencoded 数据格式的数据
formdata django 会帮你把文件数据取出来 放入request.FILES里面 专门用来传文件的
web中用Ajax传输数据的格式:
Ajax默认提交的编码格式也是 urlencoded
当用 ajax 传输 json 格式的数据的时候 django 不会做任何的处理,
数据以二进制的形式放在 request.body 中可以手动解码加反序列化拿到对应的字典格式数据
ajax 发送文件 利用js内置的FormData对象
Ajax发送json格式数据:
$.ajax({
url:'', // 不写默认朝当前页面所在的url地址提交
type:'post',
contentType:'application/json',
data:JSON.stringify({'name':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}),
success:function (data) {
alert(data)
}
})
Ajax发送文件格式数据:
$('#d1').click(function () {
// 如果用ajax发送文件 需要使用内置对象FormData
var formData = new FormData(); // 生成一个内置对象
// 内置对象formdata既可以传普通的键值对,也可以传文件
formData.append('name','jason'); // 普通键值对
formData.append('password','123');
// 传文件
var fileObj = $('#d2')[0].files[0]; // 先获取标签对象 转成原生js对象 通过内置的files方
法拿到列表 然后去索引0拿到文件对象
formData.append('myfile',fileObj);
$.ajax({
url:'', // 不写默认朝当前页面所在的url地址提交
type:'post',
// 注意ajax在发送文件的时候 需要你手动指定两个特殊的参数
contentType:false, // 不要用任何编码 使用我formdata自带的编码即可
processData:false, // 浏览器不要处理我的数据 是什么就什么
data:formData,
success:function (data) {
alert(data)
}
})
})
form组件的应用:
一、forms组建的主要功能:
1.将前端渲染展示页面,获取用户输入
2.将数据发送给后端进行数据的合法性校验
3.将不合法的提示信息展示给用户看
二、数据的校验:
1.前端
2.后端
数据的校验前端可以没有,但后端一定要做!
三、 forms组件能实现具体功能:
1.校验数据:
forms组件的校验数据的使用
1.定义一个继承forms.Form一个类
from django import forms
class MYForm(forms.Form):
username = forms.CharField(max_length=6) # username最长只能是6位
password = forms.CharField(max_length=8,min_length=3) # password最长8位 最短3位
2.给组件传参数(字典的显示方式):
obj = views.MyForm({'username':'egondsb','password':'12','email':'123@qq.com'})
3.查看数据是否合法:
obj.is_valid()
4.查看所有校验通过的数据:
obj.cleaned_data
{'email': '123@qq.com'}
5.查看所有没有通过的数据:
obj.errors
"""
{
'username': ['Ensure this value has at most 6 characters (it has 7).'],
'password': ['Ensure this value has at least 3 characters (it has 2).']}
"""
2.渲染标签:
forms组件只能帮你渲染 获取用户输入(输入框 选择框 下拉框...)的标签提交按钮也得自己写
form表单取消前端校验功能
<form action="" method="post" novalidate>
forms组件当前端输入的信息不合法的时候 页面上的数据保留不会刷新 这样方便用户修改
3.展示提示信息:
{% for foo in form_obj %}
<p>
{{ foo.label }}{{ foo }}
<span>{{ foo.errors.0 }}</span>
</p>
{% endfor %}
4.forms组件的钩子函数:
def clean_username(self):
# 用户名中不能有666
username = self.cleaned_data.get('username')
if '666' in username:
self.add_error('username','光喊666是不行的')
return username
# 全局钩子
def clean(self):
# 获取密码和确认密码比对
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if not password == confirm_password:
self.add_error('confirm_password','两次密码不一致')
return self.cleaned_data
django中测试脚本书写
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day66.settings")
import django
django.setup()
from app01 import models
print(models.Userinfo.objects.all())