昨日内容回顾
1.choices参数
class Userinfo(models.Model):
username = ...
age = ...
gender_choice = (
(1,'male'),
(2,'female'),
(3,'others'),
)
gender = models.IntegerField(choices=gender_choice)
# gender存的是数字 若是数字在上面的对应关系中 那么在取值的时候 能够经过
user_obj.gender # 数字
user_obj.get_gender_display() # 取到的就是数字对应的解释
# 若是存的数字不在范围内 拿到的仍是数字自己
2.MTV与MVC模型
MTV:
M:models
T:templates
V:views
MVC:
M:models
V:views
C:controller
本质:MTV其实也是MVC
3.ajax(******)
异步提交
局部刷新
咱们所学的ajax是基于jQuery封装好简易版本
因此你在写ajax的时候必定要确保导入可jQuery
1.本身写一个计算功能
2.ajax基本语法结构
$.ajax({
url:'', # 指定朝哪一个后端地址发送请求 不写默认朝当前地址提交
type:'post', # 指定提交方式
data:{'username':'jason','password':'123'},
success:function(data){ # data指代的就是后端返回的异步提交的结果
# 异步回调机制逻辑处理代码
}
})
4.先后端传输数据的编码格式
编码格式种类
1.urlencoded
2.formdata
3.application/json
form表单
form表单默认的编码格式是urlencoded
urlencoded编码格式的数据特色
username=jason&password=123&age=18
# django后端针对符合urlencoded数据格式 会自动解析 并给你封装到request.POST中
# 你能够经过制定enctype参数来修改form表单提交数据的编码格式
# form表单传输文件的时候 编码格式就必须有默认的改成formdata
"""
便可以传普通的键值对也能够上传文件
django后端针对只要是符合urlencoded格式的数据都会自动解析放到request.POST
针对文件数据 会解析并放到request.FILES
"""
ajax 默认的数据编码格式也是urlencoded
也就意味着ajax发送post请求django后端默认也是经过request.POST获取数据
ajax发送json格式数据
如何查看前端提交数据的编码格式?
在请求头中有一个content-Type参数
"""
先后端交互数据的时候 必定要作到数据个编码格式的一致性
"""
1.须要手动指定编码格式
contentType:'application/json'
2.必定要确保数据也是符合json格式的
data:JSON.stringify({'username':'jason'})
# django后端针对json格式的数据 是不会作任何处理的 会原封不动的放在request.body中
你能够手动去处理获取数据
1.将bytes类型转成json格式字符串
2.利用json模块json.loads反序列化出来
ajax传输文件
ajax传文件 须要使用到js内置对象 FormData
该对象及能够携带普通的键值对 给django后端的request.POST也能够携带文件给django后端的request.FILES
# 1.现生成一个formdata对象
var MyFormData = new FormData();
# 2.添加普通的键值对
MyFormData.append('username','jason');
MyFormData.append('password','123');
# 3.添加文件
var fileObj = $('#myfile')[0].files[0];
MyFormData.append('myfile',fileObj)
"""
如何获取type=file的input标签存储的用户上传文件
"""
$.ajax({
url:'',
type:'post',
data:MyFormData,
# 须要手动指定两个关键性的参数
contentType:false,
processData:false,
success:function(data){
...
}
})
序列化组件
from django.core imprt seralizers
user_queryset = models.Userinfo.objects.all()
res = seralizers.Seralizer('json',user_queryset)
"""
res = [{},{},{}]
"""
return HttpResponse(res)
ajax + sweetalert
今日内容
批量插入数据
bulk_create
# 1.往书籍表中插入数据 1000
# for i in range(1000): # 这种插入方式 效率极低
# models.Book.objects.create(title='第%s本书'%i)
book_list = []
for i in range(100000): # 时间仍是很短 二者差距很大
book_list.append(models.Book(title='第%s本书'%i))
models.Book.objects.bulk_create(book_list) # 批量插入数据
# 2.将刚刚插入的数据查询出来展现到前端
book_queryset = models.Book.objects.all()
return render(request,'index.html',locals())
自定义分页器
重点在于推到思路 代码你能够不掌握
自定义分页器的使用 新建一个py文件将代码直接拷贝过去
后端
from app01.utils.mypage import Pagination
# 使用封装好的分页器代码
def login(request):
book_queryset = models.Book.objects.all()
current_page = request.GET.get('page',1)
all_count = book_queryset.count()
# 1.实例化产生对象
page_obj = Pagination(current_page=current_page,all_count=all_count)
# 2.对真实数据进行切片操做
page_queryset = book_queryset[page_obj.start:page_obj.end]
return render(request,'login.html',locals())
前端
{% for book_obj in page_queryset %}
html
{{ book_obj.title }}前端
三种渲染前端页面的方式ajax
第一种渲染前端页面的方式:封装程度过高了 标签样式及参数不方便调整 可扩展性差(不推荐使用)
{{ form_obj.as_p }}
{{ form_obj.as_ul }}
django
第二种渲染页面的方式:扩展性较高 不足之处在于 须要你手写的代码量比较多(不推荐使用)json
{{ form_obj.username.label }}{{ form_obj.username }}
后端
{{ form_obj.password.label }}{{ form_obj.password }}
app
{{ form_obj.email.label }}{{ form_obj.email }}
异步
第三种渲染前端页面的方式:代码量和扩展性都很高(推荐使用)函数
{{ foo.label }}{{ foo }}post
局部钩子 # 当你须要对某一个字段数据进行额外的一些列校验 你能够考虑使用钩子函数 # 针对单个字段的 使用局部钩子 def clean_username(self): username = self.cleaned_data.get('username') if '水浒传' in username: # 给username字段下面提示错误信息 self.add_error('username','用户名不符合社会主义核心价值观') return username 全局钩子 # 针对多个字段的校验 使用全局钩子 eg:校验两次密码是否一致 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
如何改变input框的type属性值
widget= widgets.TextInput()
widget=widgets.PasswordInput()
如何让forms组件渲染出来的input框有form-control类属性
widget= widgets.TextInput(attrs={'class':'form-control others'}) # 若是有多个类属性 空格隔开
widget=widgets.PasswordInput(attrs={'class':'form-control others'})
每一个字段 还支持正则校验
from django import forms
from django.forms import Form
from django.core.validators import RegexValidator
class MyForm(Form): user = forms.CharField( validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')], )