django进阶woz333333

1什么时候用母版?2html页面有重复的代码,把它们提取出来放到一个单独的html文件(比如:导航条和左侧菜单)34子页面如何使用母版?5{%extends'base.html'%}-->必须要放在子页面的第一行6母版里面定义block(块),子页面使用block(块)去替换母版中同名的块

(2)组件

1什么时候用组件?2重复的代码,包装成一个独立的小html文件。34如何使用?5{%include'nav.html'%}

(3)Django模板语言中关于静态文件路径的灵活写法

(4)自定义simple_tag和自定义inclusion_tag

1自定义的simple_tag:2比filter高级一点点,返回一段文本3它可以接受的参数个数大于245自定义的inclusion_tag:6用来返回一段html代码(示例:返回ul标签)py文件(放在在app下面新建的templatetags文件夹(包)):

HTML:

(1)什么是FBV及CBV

视图:接收请求返回响应那部分

FBV:functionbaseview基于函数的视图

CBV:classbaseview基于类的视图

(2)CBV实例

views.py:

1#CBV实例-添加新的出版社2classAddPublisher(View):3defget(self,request):4returnredirect("/book/publisher_list/")56defpost(self,request):7new_name=request.POST.get("publisher_name",None)8ifnew_name:9#通过ORM去数据库里新建一条记录10models.Publisher.objects.create(name=new_name)11returnredirect("/book/publisher_list/")urls.py:

1url(r'^add_publisher/',views.AddPublisher.as_view()),

(3)上传文件

上传文件要使用到request的以下参数:

request.FILES:包含所有上传文件的类字典对象;FILES中的每一个Key都是标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

前端HTML:

123456注意:7上传文件时表单中的enctype="multipart/form-data"必须要写8input(file)必须要有nameviews.py:

1defupload(request):2ifrequest.method=="POST":3filename=request.FILES["upload-file"].name4#在项目目录下新建一个文件->项目根目录5withopen(filename,"wb")asf:6#从上传的文件对象中一点一点读7forchunkinrequest.FILES["upload-file"].chunks():8#写入本地文件9f.write(chunk)10returnHttpResponse("上传OK")11returnrender(request,"test/test_upload.html")

(1)djangoORM增删改查

(2)ORM字段

常用字段:

常用的字段参数:

DateField和DateTimeField才有的参数:

(3)关系字段

eg:

关于多对多:

1#多对多的方式:2#1.ORMManyToManyField()自动帮我创建第三张表-->关系表中没有额外字段、ORM封装了很多方法可以使用:add()remove()set()clear()34#2.自己创建第三张表,利用外键分别关联作者和书这种方法关联查询比较麻烦,因为没办法使用ORM提供的便利方法56#3.自己创建第三张表,用ORM的ManyToManyField()的through指定表名(自建的关系表)-->可向关系表中添加额外字段,使用此种方式没有ORM封装的方法可使用注:through_fields=(field1,field2)field1是关系表通过哪个属性可以找到这张表789#我们应该用哪种?看情况:10#如果你第三张表没有额外的字段,就用第一种11#如果你第三张表有额外的字段,就用第三种或第一种1213#有额外字段的实际情况:14"""15相亲网站:16Boy17girl=ManyToManyField(to=“Girl")1819Girl2021约会记录:多对多22idboy_idgirl_iddate23"""实例:

(4)单表查询的双下划线用法

1models.Book.objects.filter(id__gt=1)2models.Book.objects.filter(id__in=[1,2,3])3models.Book.objects.filter(id__range=[1,5])4models.Book.objects.filter(title__contains="python")5models.Book.objects.filter(title__icontains="python")6models.Book.objects.filter(title__startswith="python")7models.Book.objects.filter(title__endswith="python")8models.Book.objects.filter(publish_date__year=2017)9models.Book.objects.filter(publish_date__month=2)

(1)ORM查询

返回QuerySet对象:

返回一个特殊的QuerySet对象:

返回一个具体对象:

返回布尔值:

exists():如果QuerySet包含数据,就返回True,否则返回False

返回数字:

count():返回数据库中匹配查询(QuerySet)的对象数量

多对多查询拓展:

(2)外键的查询操作

1#正向查询:2#查询第一本书的出版社3book_obj=models.Book.objects.all().first()4ret=book_obj.publisher5res=book_obj.publisher.name6print(ret,res)7#查询id是7的书的出版社的名称8#利用双下划线跨表查询双下划线就表示跨了一张表9ret=models.Book.objects.filter(id=7).values_list("publisher__name")10print(ret)1112#反向查询:13#1.基于对象查询14publisher_obj=models.Publisher.objects.get(id=1)#得到一个具体的对象15#ret=publisher_obj.book_set.all()16#在外键字段中加上related_name="books",之后就要使用下面的方法查询:17ret=publisher_obj.books.all()18print(ret)19#2.基于双下划线20ret=models.Publisher.objects.filter(id=1).values_list("books__title")21print(ret)注意:

(3)多对多操作

查询:

1#查询第一个作者:2author_obj=models.Author.objects.first()3print(author_obj.name)4#查询写过的书:5ret=author_obj.book.all()6print(author_obj.book,type(author_obj.book))7print(ret)增删改查操作:

1#1.create2#通过作者创建一本书,会自动保存3#做了两件事:1.在book表里面创建一本新书,2.在作者和书的关系表中添加关联记录4author_obj=models.Author.objects.first()5author_obj.book.create(title="wyb自传",publisher_id=1)67#2.add8#在wyb关联的书里面,再加一本id是8的书9book_obj=models.Book.objects.get(id=8)10author_obj.book.add(book_obj)11#添加多个12book_objs=models.Book.objects.filter(id__gt=5)13author_obj.book.add(*book_objs)#要把列表打散再传进去14#直接添加id15author_obj.book.add(9)1617#3.remove18book_obj=models.Book.objects.get(title="跟Alex学泡妞")19author_obj.book.remove(book_obj)20#把id是8的记录删掉21author_obj.book.remove(8)2223#4.clear24#清空25jing_obj=models.Author.objects.get(id=2)26jing_obj.book.clear()注意:

对于ForeignKey对象,clear()和remove()方法仅在null=True时存在

(4)分组和聚合查询

聚合查询:

aggregate()是QuerySet的一个终止子句,意思是说,它返回一个包含一些键值对的字典。

键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的

用到的内置函数:

1fromdjango.db.modelsimportAvg,Sum,Max,Min,Count实例如下:

1fromdjango.db.modelsimportAvg,Sum,Max,Min,Count2res=models.Book.objects.all().aggregate(price_avg=Avg("price"),price_max=Max("price"),price_min=Min("price"))3print(res)4print(res.get("price_avg"),res.get("price_max"),res.get("price_min"))5print(type(res.get("price_max")))#

分组查询:

1#查询每一本书的作者个数2fromdjango.db.modelsimportAvg,Sum,Max,Min,Count3ret=models.Book.objects.all().annotate(author_num=Count("author"))4print(ret)5forbookinret:6print("书名:{},作者数量:{}".format(book.title,book.author_num))78#查询作者数量大于1的书9ret=models.Book.objects.all().annotate(author_num=Count("author")).filter(author_num__gt=1)10print(ret)1112#查询各个作者出的书的总价格13ret=models.Author.objects.all().annotate(price_sum=Sum("book__price"))14print(ret)15foriinret:16print(i,i.name,i.price_sum)17print(ret.values_list("id","name","price_sum"))

(5)F查询和Q查询

F查询:

在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

Django提供F()来做这样的比较。F()的实例可以在查询中引用字段,来比较同一个model实例中两个不同字段的值

F查询实例:

Q查询:

filter()等方法中的关键字参数查询都是一起进行“AND”的。如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象

Q查询实例:

1fromdjango.db.modelsimportQ2#查询卖出数大于1000,并且价格小于100的所有书3ret=models.Book.objects.filter(maichu__gt=1000,price__lt=100)4print(ret)56#查询卖出数大于1000,或者价格小于100的所有书7ret=models.Book.objects.filter(Q(maichu__gt=1000)|Q(price__lt=100))8print(ret)910#Q查询和字段查询同时存在时,字段查询要放在Q查询的后面11ret=models.Book.objects.filter(Q(maichu__gt=1000)|Q(price__lt=100),title__contains="金老板")12print(ret)

ORM拓展内容总结:

(1)什么是csrf

csrf:跨站请求伪造

百度解释:CSRF(Cross-siterequestforgery)跨站请求伪造,也被称为“OneClickAttack”或者SessionRiding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性

一句话解释:CSRG是指通过通过伪造页面来欺骗用户,让用户在钓鱼网址上输入关键信息,然后修改部分数据提交给真正的服务端程序

(2)csrf实例

钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别?(页面是怎么来的?)

钓鱼网站如何实现钓鱼:前端页面一模一样,但是在表单中隐藏了某些关键的input然后这些input写成无用的input显示在页面上,这些隐藏的input的value是固定值,无论你在那些无用的input上输入什么值,最后提交给服务端的值都是确定的

详情见下面实例:

真正的网站前端代码:

123456转账78910

真正的网站

1112

13转出:1415

16

17转入:1819

20

21金额:2223

24

2526

2728293031真正的网站后端代码:

1#真正网站的服务端:2deftransfer(request):3ifrequest.method=="GET":4returnrender(request,"test/transfer_test.html")5from_=request.POST.get("from")6to_=request.POST.get("to")7money=request.POST.get("money")8print("{}给{}转了{}钱".format(from_,to_,money))9returnHttpResponse("转账成功!")钓鱼网站前端代码:

1deftransfer(request):2returnrender(request,"transfer.html")两者页面如下:

注:页面中的标题只是为了便于区分,正真的钓鱼网站可以说和原网站几乎一模一样,可以以假乱真

两个网站转账的数据相同时转账效果:

钓鱼网站通过隐藏的input框修改了转账的转入方,在钓鱼网站上的转入方无论你填什么最后转入方都是黑客

(3)Django内置的处理csrf问题的中间件

django中内置的处理csrf问题的中间件是:django.middleware.csrf.CsrfViewMiddleware这个中间件做的事情:

真正网站:

CBV写法:

1fromdjango.views.decorators.csrfimportcsrf_exempt,csrf_protect2fromdjango.utils.decoratorsimportmethod_decorator34classHomeView(View):5@method_decorator(csrf_exempt)6defdispatch(self,request,*args,**kwargs):7returnsuper(HomeView,self).dispatch(request,*args,**kwargs)89defget(self,request):10returnrender(request,"home.html")1112defpost(self,request):13print("HomeViewPOSTmethod...")14returnredirect("/index/")151617#或者这样写:18@method_decorator(csrf_exempt,name='dispatch')19classHomeView(View):2021defdispatch(self,request,*args,**kwargs):22returnsuper(HomeView,self).dispatch(request,*args,**kwargs)2324defget(self,request):25returnrender(request,"home.html")2627defpost(self,request):28print("HomeViewPOSTmethod...")29returnredirect("/index/")FBV写法:

1fromdjango.views.decorators.csrfimportcsrf_exempt,csrf_protect23@csrf_exempt4deflogin(request):5xxx

(1)分页基本逻辑

books/page=n-->n是整数,表示第几页

1#第一页:all_book=models.Book.objects.all()[0:10]#1到102#第二页:all_book=models.Book.objects.all()[10:20]#11到203#第三页:all_book=models.Book.objects.all()[20:30]#21到304#第n页:n->[(n-1)*10,n*10]从request.GET中取出page对应的数,然后取出对应的数据传给前端即可,page对应的数默认设为1

(2)自定义分页

views.py:

封装之后的分页:

1#使用封装的分页2defbooks2(request):3data=models.Book.objects.all()4pager=Pagination(request.GET.get("page"),len(data),request.path_info)5book_list=data[pager.start:pager.end]6page_html=pager.page_html()7returnrender(request,"books.html",{"books":book_list,"page_html":page_html})

THE END
1.相亲基本情况介绍模板.docx内容提供方:feixianga4 大小:1.46 MB 字数:约小于1千字 发布时间:2022-07-23发布于山东 浏览人气:432 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币 (10金币=人民币1元)相亲基本情况介绍模板.docx 关闭预览 想预览更多内容,点击免费在线预览全文 免费在线预览全文 姓名性别 出生年月照片籍https://m.book118.com/html/2022/0720/8015102037004121.shtm
2.脱单你就来——新郑炎黄广场公益相亲角发布征婚信息请参照以下模板: (可根据个人情况适当修改) 1.个人基本情况介绍: 出生年月: 性别: 身高: 体重: 学历: 职业: 工作地区: 择偶地区: 婚姻状况:(末婚、离异、丧偶) 车房情况: 家庭成员情况简介: https://www.meipian.cn/31a3p1lq
3.相亲个人信息登记表可编辑范本Word模板下载本作品内容为相亲个人信息登记表【可编辑范本】, 格式为 docx, 大小1 MB, 页数为1, 请使用软件Word(2010)打开, 作品中主体文字及图片可替换修改,文字修改可直接点击文本框进行编辑,图片更改可选中图片后单击鼠标右键选择更换图片,也可根据自身需求增加和删除作品中的内容, 源文件无水印, 欢迎使用熊猫办公。 https://www.tukuppt.com/muban/lzvpxrap.html
4.相亲网站模板资源【相亲网站模板】是一个专为搭建相亲类网站设计的静态页面模板,旨在为开发者提供一个基础框架,方便他们在此基础上进行二次开发,将其转化为具备完整功能的动态网站。这个模板通常包括首页、个人资料页、搜索匹配页、聊天互动等功能模块,能够满足用户浏览、注册、上传个人信息以及与其他用户沟通的需求。 一、页面结构与https://download.csdn.net/download/swfcy/5095612
5.佳缘登录页世纪佳缘交友网--国内在线婚恋交友平台,数百万会员在这里找到对象。现2.2亿注册会员,助您寻觅缘分!https://login.jiayuan.com/
6.婚介相亲会员个人信息展示模板图片模板素材《婚介相亲会员个人信息展示模板》是稿定设计图片模板中为您提供的素材模板在线设计制作的预览效果,点击本效果图或右侧“立即编辑”按钮,可对《婚介相亲会员个人信息展示模板》进行在线编辑设计。本素材属于时尚、简约类风格的图片类模板,主要用于竖版海报。该模板素材编https://www.gaoding.com/template/105440
7.治理高价彩礼推动移风易俗方案模板一是严格按照《章程》规定设立组织机构;二是要公示收费项目、标准、服务内容;三是要制定财务管理制度、落实财务人员;四是要建立消防、安全、防疫、应急处置等相关制度;五是要建立并完善会员登记、会员审查制度;六是要严格落实服务流程,不得发布虚假信息,不得签订包介绍成功或没得征婚期限的协议。https://www.xuexila.com/fwn/fangandaquan/c1775265.html
8.小红书相亲真实性揭秘,真诚寻缘还是虚幻泡影?2、小红书平台在巡查中发现,部分婚恋交友类营销商家存在非合规、夸大不实的营销行为,这些行为容易误导用户,甚至造成经济损失,小红书将对婚恋交友领域的营销内容进行全面的整治和管理。 3、所谓的“配对型婚介”在小红书上也不乏其例,网络平台上的相亲信息往往难以辨别真伪,包括小红书在内的平台也可能存在收费服务,由于网http://inspo.zhouchengjiareqi.com/3AF1Fd68425b.html
9.对缘品牌介绍对缘相亲网版权声明>> 修改>> 申请删除>> 网页上相关信息的知识产权归网站方所有(包括但不限于文字、图片、图表、著作权、商标权、为用户提供的商业信息等),非经许可不得抄袭或使用。本站不生产产品、不提供产品销售服务、不代理、不招商、不提供中介服务。本页面内容不代表本站支持投资购买的观点或意见,页面信息仅供参考和https://www.maigoo.com/brand/1629733.html
10.短信正文模板审核标准审核标准文档中心除公共规范外,另禁止发送营销推广类的内容和链接,包括运营商内部业务宣传信息等。 营销短信 正文模板末尾必须携带退订方式,统一退订文案为“拒收请回复 R”。 说明: 根据相关指导意见,营销短信,必须以“拒收请回复 R”专用字样清晰注明,并放置在短信息末尾。 https://cloud.tencent.com/document/product/382/39023