ajax上传文件:

<h2>基于ajax上传文件</h2><p>名字 <input type="text" id="filename"></p><p>文件 <input type="file" id="file"></p><button id="filebtn">上传文件</button>
$('#filebtn').click(function () {    //js取到文件    var myfile=$('#file')[0].files[0]    //生成一个FormData对象    var formdata=new FormData    //放值  //放文件    formdata.append('name',$('#filename').val())    formdata.append('myfile',myfile)    $.ajax({        url:'/fileupload/',        type:'post',         //这两个要必须写        processData:false, //不预处理数据  因为FormData 已经做了        contentType:false, //我不指定编码了 因为FormData 已经做了        data:formdata,        success:function (data) {            console.log(data)            alert(data)        }    })})
# ajax文件上传def fileupload(request):    if request.method == 'GET':        return render(request, 'fileupload.html')    if request.is_ajax():        name = request.POST.get('name')        # 文件对象        myfile = request.FILES.get('myfile')        import os        path = os.path.join('media', name)        with open(path, 'wb') as f:            for line in myfile:                f.write(line)        return HttpResponse('success')

django自带序列化:

# ajax page,了解,django自带的序列化def page(request):    if request.method == 'GET':        users = UserInfo.objects.all()        # json序列        # user_dic = [{'name': user.name, 'age': user.age, 'id': user.id} for user in users]        # return JsonResponse(user_dic, safe=False, json_dumps_params={'ensure_ascii': False})        # 显示结果[{"name": "abc1", "age": 11, "id": 1}, {"name": "ewe", "age": 12, "id": 2}]        # 了解,django自带的序列化        user_dic = serializers.serialize('json', users)        return HttpResponse(user_dic)        # 显示结果[{"model": "app01.userinfo", "pk": 1, "fields": {"name": "abc1", "age": 11}}, {"model": "app01.userinfo", "pk": 2, "fields": {"name": "ewe", "age": 12}}]

批量插入数据bulk_create

# 批量插入数据bulk_createdef pagemass(request):    #     # objes:对象列表,batch_size 一次插入数据的量    li = []    for i in range(200):        # UserInfo.objects.create() #老大方式        li.append(UserInfo(name='abc%s' % i, age=i + 1))    ret = UserInfo.objects.bulk_create(li, 20)    return HttpResponse('ok')

分页器组件:

# 分页器
from django.core.paginator import Paginator
def paging(request):users = UserInfo.objects.all().order_by('pk')paginator = Paginator(users, 20)try:currentpage = int(request.GET.get('page', 1))  # 默认显示第一页page = paginator.page(currentpage)except Exception as e:# 出错时显示第一页currentpage = 1page = paginator.page(currentpage)# 传入页码数,拿到的就是当前页对象page = paginator.page(currentpage)# 1 总页数是否大于11,当总页码数大于11if paginator.num_pages > 11:# 1.1 当前页码数是否小于6if 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_rangereturn render(request, 'page.html', locals())

<table class="table"><thead><tr><th>id</th><th>name</th><th>age</th></tr></thead><br><tbody>
{#                循环的时page不是users#}{% 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="/paging/?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 %}{# 判断当前页面是否是循环到的页码,如果是,加active#}{% for foo in page_range %}{% if currentpage == foo %}<li class="acitve"><a href="/paging/?page={{ foo }}">{{ foo }}</a></li>{% else %}<li><a href="/paging/?page={{ foo }}">{{ foo }}</a></li>{% endif %}{% endfor %}{#                    下一页判断#}{% if page.has_next %}<li><a href="/paging/?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>

  

forms组件:(数据校验功能)

<form action=""><p>name <input type="text" name="name"></p><p>pwd <input type="password" name="pwd"></p><p>email <input type="email" name="email"></p><input type="submit"></form><h1>forms的模板渲染之一(推荐)</h1><form action="" method="post" novalidate><p>name: {{ myform.name }}</p><p>pwd: {{ myform.pwd }}</p><p>email: {{ myform.email }}</p><input type="submit"></form><h1>forms的模板渲染之二(推荐!!!!!)</h1><form action="" method="post" novalidate>{% for item in myform %}<p>{{ item.label }}:{{ item }}</p>{% endfor %}<input type="submit"></form><h1>forms的模板渲染之三</h1><form action="" method="post" novalidate>{{ myform.as_p }}<input type="submit"></form>

from django import forms
# 继承Form这个类
class MyForm(forms.Form):# 限制name这个字段最长为8,最短为3name=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':'这个字段必填'})# ajax register
def register(request):if request.method == 'GET':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': 'abc', 'pwd': '122', 'email': '5555'}name=request.POST.get('name')pwd=request.POST.get('pwd')email=request.POST.get('email')dic = {'name': name, 'pwd': pwd, 'email': email}print(dic)myform = MyForm(dic)# 所有字典都校验通过,它就是True的if myform.is_valid():# 取出校验通过的数据clean_data=myform.changed_dataprint(clean_data)# models.UserInfo.objects.create(**clean_data)else:# 所有的错误信息# 只要是校验通过的值,都在cleaned_data中放着print(myform.changed_data)print(myform.errors.as_data())# 字典类型print(type(myform.errors))print(myform.errors.get('name'))from  django.forms.utils import ErrorDictreturn HttpResponse('OK')

  

ajax总结:

1 默认编码urlencode,后端按照原来form表单提交的形式取值就可以了()
2 上传文件,form-data编码,后端按照原来form表单提交的形式取值就可以了,取数据从POST中取,取文件从FILES中取
3 上传json格式,django不会处理数据,需要自己处理,自己从body体中取出数据处理

TTL:

转载于:https://www.cnblogs.com/du-jun/p/10289775.html

Python-Django-Ajax进阶相关推荐

  1. python django -5 进阶

    高级知识点包括: 静态文件处理 中间件 上传图片 Admin站点 分页 使用jquery完成ajax 管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义 ...

  2. python django ajax 逻辑推理_python django初识ajax

    什么是json json是轻量级文本数据交互格式 json独立语言 符合的json对象 ["one", "two", "three"] {& ...

  3. [转载] Python Web开发—进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程

    参考链接: 在Python中创建代理Web服务器 2 Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python We ...

  4. Python之面向对象进阶

    Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据 ...

  5. python django django-debug-toolbar 加载缓慢,不能使用。

    2019独角兽企业重金招聘Python工程师标准>>> python django django-debug-toolbar 不能正常使用的问题 http://django-debu ...

  6. python网站设计理念_简单介绍下python Django框架的历史,设计理念及优势_Django讲解2...

    简单介绍下python Django框架的历史,设计理念及优势 Django是一个高层次的 Python Web 框架,它是一个鼓励快速开发和干净,实用的框架设计.Django可以更容易地快速构建更好 ...

  7. 基于Python + Django + mysql的协同推荐算法的电影推荐系统

    基于Python + Django + mysql的协同推荐算法的电影推荐系统 本系统一共分为前台系统功能和后台系统功能两个模块,两个模块之间虽然在表面上是相互独立的,但是在对数据库的访问上是紧密相连 ...

  8. Django Ajax总结

    Django Ajax总结 Ajax-Jquery ajax 配合 json 使用BookStrap进行前端框架开发 font-awesome 图标插件 Ajax全套 发送请求 1.使用JQuery调 ...

  9. Nginx + uWSGI + Python + Django构建必应高清壁纸站

    写在前面 做这个网站的初衷是因为,每次打开必应搜索搜东西的时候都会被上面的背景图片吸引,我想必应的壁纸应该是经过专业人员精选出来的,我甚至会翻看以前的历史图片,唯一美中不足的是必应的首页只能查看最多7 ...

  10. Nginx + uWSGI + Python + Django搭建一款只属于自己的壁纸网站

    写在前面 做这个网站的初衷是因为,每次打开必应搜索搜东西的时候都会被上面的背景图片吸引,我想必应的壁纸应该是经过专业人员精选出来的,我甚至会翻看以前的历史图片,唯一美中不足的是必应的首页只能查看最多7 ...

最新文章

  1. 多个相机拍摄定位_两种方式拍照易泄露隐私 | 如何避免照片记录 iPhone 定位信息?...
  2. (60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程
  3. etcd v3 集群——简单配置
  4. Java Hashtable keySet()方法与示例
  5. Dubbo源码分析:ProxyFactory
  6. 【AI面试题】逻辑回归如何处理多标签分类问题
  7. HDU 1085 Holding Bin-Laden Captive!
  8. angular.js之作用域scope'@','=',''
  9. SQL Server 2012入门T-SQL基础篇:(7)Where子句与Having子句的区别
  10. .NET 2.0 的压缩功能
  11. C/C++[黑盒测试]
  12. 带壳破解SMC补丁技术
  13. 基于单片机的水温液位监测系统设计(#0513)
  14. 老师一天表情大全,也太搞笑了!
  15. WPS删除粘贴后的[]中括号痕迹
  16. React中的SVG陷阱
  17. Google Chrome 75.0.3770.100 插件丰富且自带翻译的浏览器
  18. iOS创建framework静态库(SDK组件化)
  19. 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.鏈嶅姟鍣ㄧ増鏈�:
  20. LINUX系统编程__文件编程__LINUX库open等函数的应用

热门文章

  1. 几大科技公司在VR方面的布局是怎么样的?
  2. sift的java实现解述
  3. Stanford UFLDL教程 稀疏编码自编码表达
  4. 数字图像处理:第十一章基于特征向量的变换
  5. 二叉排序树的建立、先序/中序/后序遍历、查找
  6. 从简历筛选看怎么写一篇有亮点的简历
  7. jquery 网页局部打印总结
  8. VC学习笔记---ATL MFC CLR三个库的区别
  9. 从零开始学_JavaScript_系列(16)——CSSlt;3gt;(文本、对齐、圆角、盒模型、背景)...
  10. 高性能网络编程1----accept建立连接