ajax补充知识点、多对多外键的三种创建方式、django内置序列化组件、批量操作数据、分页器推导思路与自定义分页器的使用、form组件

今日内容

ajax补充说明

主要是针对回调函数args接收到的响应数据

1.后端request.is_ajax()
	用于判断当前请求是否由ajax发出
2.后端返回的三板斧都会被args接收不在影响整个浏览器页面
3.选择使用ajax左前后端交互的时候 后端一般返回的都是字典数据
	user_dict ={'code':1000,'username':'哈哈哈','hobby':'read'}
ajax自动反序列化后端的json格式的bytes类型数据
	dataType:'json',    	

多对多三种创建方式

1.全自动创建

class Book(models.Model):
    title = models.CharField(max_length=32,verbose_name='书名')
    author = models.ManyToManyField(to='Publish')

class Publish(models.Model):
    name = models.CharField(max_length=32)
    
    
优势:自动创建第三张表  并且提供了add、remove、set、clear四种操作
劣势:第三张表无法创建更多字段 扩展性较差

2.纯手动创建

class Book(models.Model):
    title = models.CharField(max_length=32)
    author = models.ManyToManyField(to='Publish')

class Publish(models.Model):
    name = models.CharField(max_length=32)

class Book2Publish(models.Model):
    book = models.ForeignKey(to='Book',on_delete=models.CASCADE)
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
    others = models.CharField(max_length=32)
优势:第三张表完全有自己创建 扩展性强
劣势:编写麻烦 并且不支持add、remove、set、clear以及正反向概念

3.半自动创建

class Book(models.Model):
    title = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author',
                                     through='Book2Author', through_fields=('book', 'author')
                                     )

class Author(models.Model):
    name = models.CharField(max_length=32)

class Book2Author(models.Model):
    book = models.ForeignKey(to='Book', on_delete=models.CASCADE)
    author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
    others = models.CharField(max_length=32)
    join_time = models.DateField(auto_now_add=True)
    
优势:第三张表完全由自己创建 扩展性强 可以用正反向
劣势:编写麻烦不再支持add、remove、set、clear

django内置序列化组件(drf前身)

'''前后端分离的项目 视图函数只需要返回json格式的数据即可'''
def ab_ser_func(request):
    # 1.查询所有的书籍对象
    book_queryset = models.Book.objects.all()  # queryset [对象、对象]
    # 2.封装成大字典返回
    data_dict = {}
    for book_obj in book_queryset:
        temp_dict = {}
        temp_dict['pk'] = book_obj.pk
        temp_dict['title'] = book_obj.title
        temp_dict['price'] = book_obj.price
        temp_dict['info'] = book_obj.info
        data_dict[book_obj.pk] = temp_dict  # {1:{},2:{},3:{},4:{}}
    return JsonResponse(data_dict)


序列化组件(django自带 后续学更厉害的drf)
#导入内置序列化模块
from django.core import serializers
#调用该模块下的方法 第一个参数是你想以什么样的方式序列化你的数据
res=serializers.serializa('json',book_queryset)
return HTTPResponse(res)

批量操作数据

def ab_bk_func(request):
    # 1.往books表中插入10万条数据
    # for i in range(1, 100000):
    #     models.Books.objects.create(title='第%s本书' % i)
    """直接循环插入 10s 500条左右"""
    book_obj_list = []  # 可以用列表生成式[... for i in ... if ...]     生成器表达式(... for i in ... if ...)
    for i in range(1, 100000):
        book_obj = models.Books01(title='第%s本书' % i)  # 单纯的用类名加括号产生对象
        book_obj_list.append(book_obj)
    # 批量插入数据
    models.Books01.objects.bulk_create(book_obj_list)
    """使用orm提供的批量插入操作 5s 10万条左右"""
    # 2.查询出所有的表中并展示到前端页面
    book_queryset = models.Books01.objects.all()
    return render(request, 'BkPage.html', locals())

分页器思路

分页器主要听处理逻辑 代码最后很简单 
推导流程
	1.queryset支持切片操作(正数)
	2.研究各个参数之间的数学关系
 		每页固定展示多少条数据、起始位置、终止位置
 	3.自定义页码参数
    	current_page = request.GET.get('page')
 	4.前端展示分页器样式
	5.总页码数问题
    	divmod方法
 	6.前端页面页码个数渲染问题
    	后端产生 前端渲染

自定义分页器的使用

django自带分页器模块但是使用起来很麻烦 所以我们自己封装了一个

只需要掌握使用方式即可

def ab_pg_func(request):
    book_queryset = models.Books01.objects.all()
    from app01.utils.mypage import Pagination
    current_page = request.GET.get('page')
    page_obj = Pagination(current_page=current_page, all_count=book_queryset.count())
    page_queryset = book_queryset[page_obj.start:page_obj.end]
    return render(request, 'pgPage.html', locals())


{% for book_obj in page_queryset %}
   <p>{{ book_obj.title }}</p>
{% endfor %}
{{ page_obj.page_html|safe }}

form组件

小需求:获取用户数据并发送给后端校验 后端返回不符合校验规则的提示信息
    
form组件
	1.自动校验数据
	2.自动生成标签
	3.自动展示信息
    
from django import forms


class MyForm(forms.Form):
    username = forms.CharField(min_length=3, max_length=8)  # username字段最少三个字符最大八个字符
    age = forms.IntegerField(min_value=0, max_value=200)  # 年龄最小0 最大200
    email = forms.EmailField()  # 必须符合邮箱格式
    
 
校验数据的功能(初识)
	 form_obj = views.MyForm({'username':'jason','age':18,'email':'123'})
    form_obj.is_valid()  # 1.判断数据是否全部符合要求
    False  # 只要有一个不符合结果都是False
    form_obj.cleaned_data  # 2.获取符合校验条件的数据
    {'username': 'jason', 'age': 18}
    form_obj.errors  # 3.获取不符合校验规则的数据及原因
    {'email': ['Enter a valid email address.']}
1.只校验类中定义好的字段对应的数据 多传的根本不做任何操作
2.默认情况下类中定义好的字段都是必填的
本文转载于网络 如有侵权请联系删除

相关文章

  • J2EE 核心模式学习理解和记录

    第1章:导论。模式能够:利用一个经过验证可行的解决方案;提供一套通用词汇;约束解决方案的空间。第2章:表现层设计考虑和不佳实践。客户端验证:基于表单的验证、基于抽象类型的验证。曾经在JSP中滥用过的助手类,通过助手类在页面和业务逻辑之间传递数据,有点类似于如今Struts中的Action作为传值模型时的情况。表现层不佳实践:多个视图中都包含控制代码;表现层数据结构暴露给业务层或者业务领域对象,比如:暴露HTTPServletRequest;重复提交表单;敏感资源暴露给客户端直接访问,有个原则,敏感的东西不能放在WEB-INF之外;胖控制器;……怎么区分后台视图层和前台页面层?或者说,怎么划分哪些事情JSP或者模板做,哪些事情JavaScript做?首先,根据模型驱动的原则,通常送到JSP或者模板上的都是通用模型的对象或者对象集,JSP或者模板根据需要选择展示出来,但是后续可抽取为不需和服务端交互状态下响应用户的行为,应当划分为JavaScript的工作。第3章:业务层设计考虑和不佳实践:sessionbean:根据EJB规范,每个sessionbean专门服务于一个客户端或者用户,生命

  • mysql索引及优化

    1.mysql索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。 创建索引时,你需要确保该索引是应用在SQL查询语句的条件(一般作为WHERE子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。2.索引类型普通索引,唯一索引,主键索引,全文索引。无论任何类型,都是通过建立关键字与位置的对应关系来实现的。以上类型的差异:对索引关键字的要求不同。添加修改索引语法: ALTERTABLEtbl_nameADDINDEXindex_name(column_list(length)):添加普通索引,索引值可

  • Android 中Fragment与Activity通讯的详解

    Android中Fragment与Activity通讯的详解与activity通讯尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例。 Fragment可以调用getActivity()方法很容易的得到它所在的activity的对象,然后就可以查找activity中的控件们(findViewById())。例如:ViewlistView=getActivity().findViewById(R.id.list);复制同样的,activity也可以通过FragmentManager的方法查找它所包含的frament们。例如:ExampleFragmentfragment=(ExampleFragment)getFragmentManager().findFragmentById(R.id.example_fragment复制activity响应fragment的事件有时,你可能需要fragment与activity共享事件。一个好办法是在fragment中定义一个回调接口,然后在act

  • Kotlin类型安全构建器的一次运用记录

    在android官方指导的相关应用框架中,用到一个Resource类来表示网络请求的状态与结果//Agenericclassthatcontainsdataandstatusaboutloadingthisdata. sealedclassResource<T( valdata:T?=null, valmessage:String?=null ){ classSuccess<T(data:T):Resource<T(data) classLoading<T(data:T?=null):Resource<T(data) classError<T(message:String,data:T?=null):Resource<T(data,message) }复制大多数情况下我们在activity里面是这样用的privatevaltestViewModel:TestViewModelbyviewModels() privatefungetUserInfo(uid:String){ testViewModel.userInfoData.observe(

  • 当分页遇到海量数据怎么办?

    一、背景 分页应该是极为常见的数据展现方式了,一般在数据集较大而无法在单个页面中呈现时会采用分页的方法。各种前端UI组件在实现上也都会支持分页的功能,而数据交互呈现所相应的后端系统、数据库都对数据查询的分页提供了良好的支持。以几个流行的数据库为例:查询表t_data第2页的数据(假定每页5条)MySQL的做法:select*fromt_datalimit5,5复制PostGreSQL的做法:select*fromt_datalimit5offset5复制MongoDB的做法:db.t_data.find().limit(5).skip(5);复制尽管每种数据库的语法不尽相同,通过一些开发框架封装的接口,我们可以不需要熟悉这些差异。如SpringData提供的分页接口:publicinterfacePagingAndSortingRepository<T,IDextendsSerializable> extendsCrudRepository<T,ID>{ Page<T>findAll(Pageablepageable); }复制这样看来,开发一个分

  • 微信聊天记录能不能恢复?99%的人都是这样找回的

    微信聊天记录能不能恢复?微信聊天记录怎么恢复?对于这类问题想必大家都遇见过。因为微信在我们生活中占据很高份额,无论是生活还是工作都离不开它,所以说里面有我们很多珍贵的回忆,所以当微信聊天记录误删了,大家都很着急,为此我们来了解一下如何恢复微信聊天记录。微信聊天记录恢复原理首先微信聊天记录是可以恢复的,根据数据库原理,当文件数据被删除之后,其实并没有在数据库中第一时间彻底清除。只是在这个数据上做了一个标记,但是当新数据覆盖在上面想要恢复就有点难度了,所以说一定要及时恢复数据。情况一:微信程序奔溃导致微信聊天记录丢失很多情况下微信在使用时突然出现闪退,导致微信聊天记录异常丢失的情况,对此官方提供了微信聊天记录修复工具。具体操作如下:首先打开微信点击【我】——【设置】——【帮助与反馈】——点击右上角【扳手】符号——点击【修复聊天记录】即可。情况二:电脑版微信聊天记录备份恢复如果说电脑端微信同步了手机端微信聊天记录,恢复起来就非常方便了。具体操作如下:点击左下角【三】→选择【备份与恢复】→选择【备份聊天记录至电脑】→再次选择【恢复聊天记录至手机】即可完成微信聊天记录丢失恢复。但是,如果电脑版微

  • 【leetcode】Rotate List

    Question:Givenalist,rotatethelisttotherightby k places,where k isnon-negative.Forexample: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL.Anwser1:mergeacircle /** *Definitionforsingly-linkedlist. *structListNode{ *intval; *ListNode*next; *ListNode(intx):val(x),next(NULL){} *}; */ classSolution{ public: ListNode*rotateRight(ListNode*head,intk){ //StarttypingyourC/C++solutionbelow //DONOTwriteintmain()function assert(k>=0); if(head==NULL)returnNULL

  • Mysql数据类型以及字段属性大盘点

    1、 时间和日期l Date:存储日期信息,标准形式YYYY-MM-DD,但是形如20120808以及2012*08*08或者2012!08!08。也就是说不论中间用何种分隔,存储到数据库之后都是2012-08-00l Datetime:存储日期和时间组合,标准格式YYYY-MM-DDHH:MM:SS。Datetime取值范围在1000-01-0100:00:00~9999-12-3123:59:59l Time:存储时间信息,-838:59:59~838:59:59范围l Timstamp:和datetime的区别在于插入和更新会自动回去当前时间l  Year:存储年份信息,有两位和4位之分2、 数字数值类型Bool是tinyint的别名,用于赋值0或者1Bigint:数据类型提供了mysql最大的整数范围,取值范围分为有符号:-9223372036854775808~9223372036854775807,无符号是0~18446744073709551615Int:提供了第二大的整数范围Mediumint:提供了第三大整数SMAllint:提供了第四大整数范围Tinyint:提供了

  • 防CSRF攻击:一场由重复提交的问题引发的前端后端测试口水战

    重复提交,这是一直以来都会存在的问题,当在网站某个接口调用缓慢的时候就会有可能引起表单重复提交的问题,不论form提交,还是ajax提交都会有这样的问题,最近在某社交app上看到这么一幕,这个团队没有做重复提交的验证,从而导致了数据有很多的重复提交,在这里我们不讨论谁对谁错,问题解决即可。首先的一种方式,在前端加入loading,或者是blockUI,在ios以及安卓上也是类似,效果如下:这个时候整个页面不能再用鼠标点击,只能等待请求响应以后才能操作具体可以参考blockUI这个插件此外就是后端了,其实后端在一定程度上也要进行防止重复提交的验证,某些无所谓的情况下可以在前端加,某些重要的场景下比如订单等业务就必须再前后端都要做,为了测试方便,blockUI就直接注释在后台我们线程sleep5秒多次点击,效果如下步骤1:页面生成token,每次进入都需要重新生成 设置自定义标签 页面生成查看redis拦截器代码:测试:这样重复提交的问题就解决了,同时也解决了CSRF攻击的问题,关于什么是CSRF可以自行百度*注意:1、token生成也可以在异步调用的时候生成,也就是一次请求一个token

  • 从SAP最佳业务实践看企业管理(11)-CRM

    C66客户和联系人管理本文介绍了CRM客户和联系人管理的可能业务情景。此业务情景逐步向您展示了客户和联系人管理如何对销售流程进行支持、可用的选项以及可在此流程中使用的功能。本文按逻辑顺序汇总了多个活动。一般而言,一个活动的完成是下一个活动的前提。根据您的项目中所采用的配置,您的情况会与本文中的描述有所不同。流程步骤业务条件业务角色预期结果创建销售员工的任务具有新潜在客户的联系人销售经理未完成任务检查任务销售员工在未完成任务清单中发现任务创建新客户销售员工已创建新客户创建新联系人销售员工已向客户添加新联系人完成任务存在未完成任务销售员工任务状态设置为已完成创建客户的任务存在客户销售员工已创建任务创建呼出电话存在联系人数据销售员工销售员工已致电客户更改现有客户已接收附加信息销售员工已更新客户详细信息在现有客户中添加采购中心同一客户存在多个不同角色的联系人销售员工采购中心已创建并以图形形式显示合并客户误创建了一个客户销售经理两个客户已合并将客户分配至客户层次结构销售员工新客户已分配至现有层次结构打印客户资料表销售员工已打印实际情况表

  • 全文检索技术

    前言2014年数据,facebook图片每天新增20PB; youtue一分钟上传400小时视频 谷歌一分钟翻译1亿个单词 百度一个词条对应数据量5000万-1亿 所以现在的互联网是一个信息大爆发的时代,有信息 就要有搜索,而且必须是又快,有全面,又准确的搜索,对于 检索,我将搜索分为传统检索与全文检索两个方面复制传统检索文件内存检索windows操作系统文件检索,wordoneNoteexcel等等数据量是不大的,将文件本身加载到内存中功能相对不算丰富。数据库检索基于sql的like语句对数据库进行模糊查询,但是使用like语句进行搜索的效率极低。全文检索全文数据库是全文检索系统的主要构成部分。所谓全文数据库是将一个完整的信息源的全部内容转化为计算机可以识别、处理的信息单元而形成的数据集合。全文数据库不仅存储了信息,而且还有对全文数据进行词、字、段落等更深层次的编辑、加工的功能,而且所有全文数据库无一不是海量信息数据库。(来自百度百科)全文检索如何实现高精度匹配以百度搜索为例,当你百度一下你想要搜索的内容之后,页面返回 大量的信息,这些信息是从哪里来的,随便点进一个链接都会进入 不同

  • 微服务实战(七):落地微服务架构到直销系统(实现命令与命令处理器)

    我们先来看看CQRS架构,你对下图的架构还有印象吗?每个组件的功能都还清楚吗?如果有疑问,请查考文章《微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)》。   前一篇文章已经实现了EventStore的基础功能部分,本篇文章我们通过C端的标准方式,实现一个下单的高并发命令端,来看看需要实现的具体流程: 1.前端用户调用一个下单CommandWebApi,传递下单命令;下单CommandWebApi接受到下单命令后,将下单命令数据投递到一个命令队列中,向前端用户返回一个信息。 2.下单CommandHandlerWebApi侦听命令队列中的下单命令,然后调用领域对象逻辑,将执行的结果也就是Order对象的当前状态持久化到EventStore中。 3.下单CommandHandlerWebApi将下单相关信息通过事件的方式发布到一个事件队列中。(用户事件处理器最终将订单信息更新到业务库中)   下面通过代码简单体现下过程: 1.定义创建订单命令: publicclassCreateOrderCommand:BaseEvent { publicOrde

  • 冒泡排序

    <?php /** *CreatedbyPhpStorm. *User:Spectre *Date:2017/8/3 *Time:14:41 */ /** *时间复杂付为n*n *@paramarray$value *@returnarray */ functionbubble($value=[]){ $length=count($value)-1; for($i=0;$i<$length;$i++){ for($j=0;$j<$length;$j++){ if($value[$j+1]<$value[$j]){ $tmp=$value[$j+1]; $value[$j+1]=$value[$j]; $value[$j]=$tmp; } } } return$value; } /** *优化冒泡排序 * *时间复杂付为(n*n)/2 *@paramarray$value待排序数组 *@returnarray */ functionbubble_better($value=[]) { $last='';

  • 基础 --- 快读模板

    intread(){ charx=getchar(); intans=0; for(;x<'0'||x>'9';x=getchar()); for(;x>='0'&&x<='9';x=getchar()){ ans*=10; ans+=(x-'0'); } returnans; } 复制

  • git的常用命令--小白篇

      • url:远程仓库地址 origin:主机名  master:主分支 dev:分支     •  首次拉取/克隆远程仓库代码:     gitcloneurl //拉取master分支代码     gitclone-bdevurl //拉取dev分支代码   • 非首次(更新代码)拉取远程仓库代码:     gitfetchorigin/dev // 同步远程dev分支代码到本地     gitmergeorigindev//合并dev分支代码到当前分支   • 查看分支:     gitbranch-a  // 查看远程分支     gitbranch//查看本地分支   • 删除远程dev分支:     gitpushorigin--deletedev   • 创建/切换分支:     gitcheckout-bdev  //创建dev分支并切换到dev分支     gitche

  • 图文详解远程部署ASP.NET MVC 5项目 [转载]

    话外篇:     由于感觉自己的机器比较慢,配置不好,所以最近想把之前的项目部署到实验室的服务器上,但是由于常不在实验室,所以在想能不能远程部署。因此今天专门研究了一下具体的过程,下面和大家分享一下。本人新手,还望大虾勿喷,有什么问题,还望高手指点。 一、本文实验环境:    WindowsServer2012R2    SQLServer2012Express    VisualStudio2013    项目为:ASP.NETMVC5.0,使用的是LocalDB数据库 二、使用WebDeploy远程部署的条件    WebDeploy可以用于本地和远程部署Web项目,使用WebDeploy部署时有如下要求:     1.需要安装WebDeploy,下面地址:http://www.iis.net/downloads/microsoft/web-deploy

  • Vue学习之路第六篇:v-on

    v-on指令用来触发页面事件的指令。 <body> <divid="app"> <buttonv-on:click="show()">点击</button> </div> <scripttype="text/javascript"> varvm=newVue({ el:"#app", data:{}, methods:{ show:function(){ alert('aa'); } } }); </script> </body>复制 如上代码,指令书写格式为:v-on:事件名称,不要忘记书写:,等于号后面的内容是Vue对象里声明的方法。 在Vue对象里,我们添加了一个新的属性,叫做methods,它用来声明方法对象,其中show即为我们声明的方法对象。 运行结果: 在Vue中,我们还可以对v-on进行简化,用@来代替,效果是一样的,代码如下所示: <button@click="show()">点击</button>复制 除了click事件,我们还可以定义

  • vuex store更新了数据,但未触发getters

    遇到一个奇怪的问题,我将数组存储在store中,更新数组,第一次会生效,第二次就不会再触发getters,通过检查发现state中的数组是有更新的。 尝试过网上很多的解决办法: 1.gettersreturn  不生效 2.actions调用  不生效 3.Vue.set(state,'imgList',list)  不生效   后来总结,vuex中应该是不可以监听数组的修改和变化的,所以试了一下先将数组清空,然后再赋值: state.imgList = null; state.imgList = list; 可以成功触发getters,但是watch中监听不到数据的改变。

  • (周六赛) Vertical Histogram

    题意:统计字母的个数,以“*”号输出   1#include<stdio.h> 2#include<algorithm> 3#include<string.h> 4intmain() 5{ 6charstr[4][100]; 7charmap[100][100]; 8inti,j; 9inta[100]; 10while(gets(str[0])) 11{ 12memset(a,0,sizeof(a)); 13memset(map,'',sizeof(map)); 14for(i=1;i<4;i++) 15{ 16gets(str[i]); 17} 18for(i=0;i<4;i++) 19{ 20intl=strlen(str[i]); 21for(j=0;j<l;j++) 22{ 23if(str[i][j]>='A'&&str[i][j]<='Z') 24{ 25a[str[i][j]-'A']++; 26} 27} 28} 29intmax=0; 30for(i=0;i<26;i

  • php数组根据值获取键名

    php数组根据值获取键名     php数组根据值获取键名功能,主要有两个内置函数可以使用。array_search和array_keys,用于处理返回单个键名和多个键名。具体范例如下:   01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php /**  *phparraygetkeybyvalue  *php数组根据值获取键名  *@authorhttp://www.phpff.com  */ $items=array(     "banana"=>"fruit",     "tomato"=>"vegetable",     "lentil"=>"bean",     "

  • JavaScript强化教程——style、currentStyle、getComputedStyle区别介绍

    本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— style、currentStyle、getComputedStyle区别介绍 style、currentStyle、getComputedStyle区别介绍 样式表有三种方式 内嵌样式(inlineStyle):是写在Tag里面的,内嵌样式只对所有的Tag有效。 内部样式(internalStyleSheet):是写在HTML的里面的,内部样式只对所在的网页有效。 外部样式表(ExternalStyleSheet):如果很多网页需要用到同样的样式(Styles),将样式(Styles)写在一个以.css为后缀的CSS文件里,然后在每个需要用到这些样式(Styles)的网页里引用这个CSS文件。最常用的是style属性,在JavaScript中,通过document.getElementById(id).style.XXX就可以获取到XXX的值,但意外的是,这样做只能取到通过内嵌方式设置的样式值,即style属性里面设置的值。

相关推荐

推荐阅读