一.ajax上传
- ajax的文件上传 file对象=$("#myfile")[0].files[0] var formdata=new FormData() formdata.append(key,value) formdata.append(file,file对象) -$.ajax({ url:路径, type:'post', processData:false, contentType:false, data:formdata, //dataType:'json', success:function(data){ } } ) -编码格式:urlencode,form-data,json
模板cript:
$("#filebtn").click(function () { //js取到文件 var myfile = $("#id_myfile")[0].files[0] //生成一个FormData对象 var formdata = new FormData() //放值 formdata.append('name', $("#id_name").val()) //formdata.append('pwd', $("#id_name").val()) //放文件 formdata.append('myfile', myfile) //formdata.append('myfile2', myfile2) $.ajax({ url: '/fileupload/', type: 'post', //这两个要必须写 processData:false, //不预处理数据 因为FormData 已经做了 contentType:false, //我不指定编码了 因为FormData 已经做了 data: formdata, success: function (data) { console.log(data) } }) })
后端:
def fileupload(request): print(request.POST.get('name')) # 文件对象 myfile = request.FILES.get('myfile') with open(myfile.name, 'wb') as f: for line in myfile: f.write(line) return HttpResponse('上传成功')
二.分页器
分页器: -views.py中你需要掌握的 -from django.core.paginator import Paginator -生成一个paginator=Paginator(queryset对象,每页有多少数据) -paginator.cout:数据总条数 paginator.num_pages:总页码数 paginator.page_range:总页码列表 -Page对象:page=paginator.page(页码数) -page 是否有上一页,是否有下一页,下一页页码数,上一页页码数 -升级版本: -总页码数是否大于11: -当前页码-5<=1:page_range=range(1,12) -当前页码+5>=总页码数:page_range=range(总页码数-10,总页码数+1) -其它情况(生成左5右5):page_range=range(当前页码-5,当前页码+6) -总页码小于等于11: page_range=paginator.page_range -模板层: -上一页,下一页的判断 -for循环总页码列表(page_range)
模板script
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> <title>Title</title> </head> <body> <div class="row"> <div class="col-md-6 col-md-offset-3"> <table class="table"> <thead> <tr> <th>序号</th> <th>姓名</th> <th>年龄</th> </tr> </thead> <tbody> {% for user in page %} <tr> <td>{{ forloop.counter }}</td> <td>{{ user.name }}</td> <td>{{ user.age }}</td> </tr> {% endfor %} </tbody> </table> <nav aria-label="Page navigation"> <ul class="pagination"> {% if page.has_previous %} <li> <a href="/pagetest/?page={{ page.previous_page_number }}" aria-label="Previous"> <span aria-hidden="true">上一页</span> </a> </li> {% else %} <li class="disabled"> <a href="#" aria-label="Previous"> <span aria-hidden="true">上一页</span> </a> </li> {% endif %} {% for foo in page_range %} {# 判断当前页面是否是循环到的页码,如果是,加active#} {% if currentpage == foo %} <li class="active"><a href="/pagetest/?page={{ foo }}">{{ foo }}</a></li> {% else %} <li><a href="/pagetest/?page={{ foo }}">{{ foo }}</a></li> {% endif %} {% endfor %} {% if page.has_next %} <li> <a href="/pagetest/?page={{ page.next_page_number }}" aria-label="Next"> <span aria-hidden="true">下一页</span> </a> </li> {% else %} <li class="disabled"> <a href="" aria-label="Next"> <span aria-hidden="true">下一页</span> </a> </li> {% endif %} </ul> </nav> </div> </div> </body> </html>
后端:
插入数据:
from django.core.paginator import Paginator # def pagetest(request): # # 批量插入数据 # # objes:对象列表,batch_size 一次插入数据的量 # # ll=[] # # for i in range(100): # # # models.UserInfo.objects.create() # # ll.append(models.UserInfo(name='lqz%s'%i,age=i+1)) # # ret=models.UserInfo.objects.bulk_create(ll,20) # # return HttpResponse('ok')
初级版
# 初级版本,存在问题,如果页数过多,页面显示太多了 # def pagetest(request): # userlist = models.UserInfo.objects.all().order_by('pk') # try: # currentpage = int(request.GET.get('page', 1)) # paginator = Paginator(userlist, 3) # page = paginator.page(currentpage) # except Exception as e: # currentpage = 1 # # return render(request, 'pagetest.html', locals())
终极版
def pagetest(request): userlist = models.UserInfo.objects.all().order_by('pk') paginator = Paginator(userlist, 20) try: currentpage = int(request.GET.get('page', 1)) page = paginator.page(currentpage) except Exception as e: currentpage = 1 page = paginator.page(currentpage) # 传入页码数,拿到的就是当前页对象 page = paginator.page(currentpage) # 1 总页数是否大于11,当总页码数大于11 if paginator.num_pages > 11: # 1.1 当前页码数是否小于6 if currentpage <= 6: #1.1.1 当当前页码小于6的时候,就生成11个页码数 page_range = range(1, 12) # 1.2 当当前页码+5 大于等于总页码数 elif currentpage + 5 >= paginator.num_pages: # 1.2.1 往后推11个页码数 page_range = range(paginator.num_pages - 10, paginator.num_pages + 1) #1.3 生成一个左5 右5的区间 else: page_range = range(currentpage - 5, currentpage + 6) #2 总页码数不大于11 ,有多少,显示多少 else: page_range = paginator.page_range return render(request, 'pagetest.html', locals())
三.forms组件
-Django提供的用语数据校验和模板渲染的组件 -在项目中创建一个py文件 -1 写一个类继承Form -2 在类中写属性,写的属性,就是要校验的字段 -3 使用:生成一个你写的类的对象myform,把要校验的数据(字典),传到对象中:MyForm(字典) -数据多?数据少?数据多可以,少不行(required控制) -4 myform.is_valid() 是True表示所有字段都通过校验 -5 myform.cleaned_data:是一个字典,所有通过校验的数据放在里面 -6 myform.errors:是一个字典,所有的错误字段的信息 -在模板中: -{{myform.name}} -{%for item in myform%} {{item.label}}:{{item}} {%endfor%} -myform.as_table/as_p/as_ul(不推荐使用)
模板层三种渲染方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post" novalidate> <p>用户名: <input type="text" name="name"></p> <p>密码: <input type="password" name="pwd"></p> <p>邮箱: <input type="email" name="email"></p> <input type="submit" value="提交"> </form> <hr> <h1>forms的模板渲染之一(推荐)</h1> <form action="" method="post" novalidate> <p>用户名: {{ myform.name }}</p> <p>密码: {{ myform.pwd }}</p> <p>邮箱: {{ myform.email }}</p> <input type="submit" value="提交"> </form> <h1>forms的模板渲染之二(推荐)</h1> <form action="" method="post" novalidate> {% for item in myform %} <p>{{ item.label }}:{{ item }}</p> {% endfor %} <input type="submit" value="提交"> </form> <h1>forms的模板渲染之三</h1> <form action="" method="post" novalidate> {# <table>#} {# {{ myform.as_table }}#} {# </table>#} {{ myform.as_p }} <input type="submit" value="提交"> </form> </body> </html>
后端:
from django import forms # 继承Form这个类 class MyForm(forms.Form): # 限制name这个字段最长为8,最短为3 name=forms.CharField(min_length=3,max_length=8,label='用户名',required=True,error_messages={'min_length':'至少为3',
'max_length':'最长为8,您太长了'}) pwd=forms.CharField(min_length=3,max_length=8,label='密码',error_messages={'min_length':'至少为3','max_length':'最长为8,
您太长了'}) email=forms.EmailField(label='邮箱',error_messages={'invalid':'邮箱格式不合法','required':'这个字段必填'})
def register(request):
if request.method=='GET':
# 生成一个空的form对象
myform=MyForm()
return render(request,'register.html',locals())
else:
# 生成对象,传参,传字典,要校验数据的字典
# myform=MyForm(request.POST)
# 自己写要校验的字典,数据多了,多的是不校验的,但是cleaned_data中也没有多出来的数据
# dic={'name':'lqz','pwd':'123','email':'22@qq.com','xx':'xxx'}
# dic={'name':'lqz','pwd':'123','email':'22'}
dic={'name':'lqzfgsdfgsdf','pwd':'1','email':'5555'}
myform = MyForm(dic)
# 所有字典都校验通过,它就是True的
if myform.is_valid():
# 取出校验通过的数据
clean_data=myform.cleaned_data
print(clean_data)
# models.UserInfo.objects.create(**clean_data)
else:
# 所有的错误信息
# 只要是校验通过的值,都在cleaned_data中放着
print(myform.cleaned_data)
print(myform.errors.as_data())
# 字典类型
print(type(myform.errors))
print(myform.errors.get('name'))
from django.forms.utils import ErrorDict
return HttpResponse('ok')