1 模板语言之变量: -{ { }} 相当于执行了print -深度查询 . 如果是方法,不能加括号,不能传参数 2 过滤器 { { 变量|过滤器的名字:'参数' }} -add -default -safe:(慎重,注意xss攻击) -在视图层处理标签字符串:href2=mark_safe(href) -length -date 3 xss攻击 -跨站脚本攻击 4 标签: -for : {% for i in 可迭代对象 %} { {forloop}} {%empty%} 可迭代对象为空,会执行这里 {%endfor%} -if : > < and in or ... {%if 条件%} {%if 条件2} {%for %} {%endfor%} {%endif%} {%elif 条件%} {%else%} {%endif%} -with:命别名 5 自定义标签,过滤器 1 app是否注册 2 templatetags模块:名字一定不能错 3 创建py文件(名字随意) 4 from django.template import Library 5 register=Library() 6 写过滤器: @register.filter(name='别名') def myfilter(a,b): 逻辑处理 return XX 7 写个标签: @register.simple_tag(name='别名') def myfilter(a,b,c): 逻辑处理 return XX 8 使用过滤器 {%load mytag %} { {变量|过滤器名:'参数'}} 9 使用标签 {%load mytag %} {% 标签名 参数1 参数2%} 10区别: 1 过滤器最多两个参数,标签可以多个 2 使用的时候,{ {过滤器}},{% 标签%} 3 **** 过滤器可以放在if判断中,for循环中 6 模板语言注释: {#要注释的内容#} -这种注释,在浏览器中是看不到的 7 web应用: -S包括两部分:web服务器+application -目前阶段django项目用的web服务器是:wsgiref+application -上线会用uwsgi+application -web服务器(本质是socket)都实现了wsgi协议 -wsgi:web服务网关接口,是一个协议 8 模板的导入和继承 -如何引入静态文件(static目录的配置) -模板的导入: 1 写一个好看的模板 2 在想用的地方: {% include '好看模板的名字.html' %} -模板的继承 -写一个母版,base.html(留一些block(盒子)),留的盒子越多,可扩展性就越高 {% block top %} {% endblock %} -使用: -在一个新的html中 -{%extend 'base.html'%} -扩写留的对应的盒子 {% block top %} 扩写的内容 {% endblock %} -注意: 1 扩写的时候,盒子的位置无所谓,只要名字对应正确,就会正确填充 2 盒子可以不扩写,不写就是原来的样子 3 如果要显示母版盒子中原来的东西,需要 { {block.super}}----写在哪,原来的内容就放在哪 9 静态文件相关 1 直接写死的: 2 用static标签: {% load static %} 3 用get_static_prefix: {% load static %} 10 inclusion_tag:返回html片段 1 前面几步跟标签和过滤器一样 2 装饰器:@register.inclusion_tag('inclusiontag.html',name='lqz'),第一个参数是要操作的模板 3 返回一个字典,字典中的值,可以在inclusiontag中使用 4 使用: {%load 你写的那个py文件%} {% 函数名字 参数 参数 %} 11 模型层: 单表操作 -增加,删,改:两种方式:queryset对象的方法,book对象的方法 -改:需要用save() -get()方法:查询的数据有且只有一条,如果多,少,都抛异常 单表查询 -<1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序('-id') <6> reverse(): 对查询结果反向排序 <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <9> first(): 返回第一条记录 <10> last(): 返回最后一条记录 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct(): 从返回结果中剔除重复纪录 单表基于双下划线的模糊查询 Book.objects.filter(price__in=[100,200,300]) Book.objects.filter(price__gt100) Book.objects.filter(price__lt=100) Book.objects.filter(price__gte=100) Book.objects.filter(price__lte=100) Book.objects.filter(price__range=[100,200]) Book.objects.filter(title__contains="python") Book.objects.filter(title__icontains="python") Book.objects.filter(title__startswith="py") Book.objects.filter(pub_date__year=2012)
1 作业思路: id old new 1 XX 你好 2 昨日回顾: 1 模板语言之变量: -{ { }} 相当于执行了print -深度查询 . 如果是方法,不能加括号,不能传参数 2 过滤器 { { 变量|过滤器的名字:'参数' }} -add -default -safe:(慎重,注意xss攻击) -在视图层处理标签字符串:href2=mark_safe(href) -length -date ... 3 xss攻击 -跨站脚本攻击 4 标签: -for : {% for i in 可迭代对象 %} { {forloop}} {%empty%} 可迭代对象为空,会执行这里 {%endfor%} -if : > < and in or ... {%if 条件%} {%if 条件2} {%for %} {%endfor%} {%endif%} {%elif 条件%} {%else%} {%endif%} -with:命别名 5 自定义标签,过滤器 1 app是否注册 2 templatetags模块:名字一定不能错 3 创建py文件(名字随意) 4 from django.template import Library 5 register=Library() 6 写过滤器: @register.filter(name='别名') def myfilter(a,b): 逻辑处理 return XX 7 写个标签: @register.simple_tag(name='别名') def myfilter(a,b,c): 逻辑处理 return XX 8 使用过滤器 {%load mytag %} { {变量|过滤器名:'参数'}} 9 使用标签 {%load mytag %} {% 标签名 参数1 参数2%} 10区别: 1 过滤器最多两个参数,标签可以多个 2 使用的时候,{ {过滤器}},{% 标签%} 3 **** 过滤器可以放在if判断中,for循环中 6 模板语言注释: {#要注释的内容#} -这种注释,在浏览器中是看不到的 今日内容: 1 补充http请求的本质 2 web应用: -S包括两部分:web服务器+application -目前阶段django项目用的web服务器是:wsgiref+application -上线会用uwsgi+application -web服务器(本质是socket)都实现了wsgi协议 -wsgi:web服务网关接口,是一个协议 3 模板的导入和继承 -如何引入静态文件(static目录的配置) -模板的导入: 1 写一个好看的模板 2 在想用的地方: {% include '好看模板的名字.html' %} -模板的继承 -写一个母版,base.html(留一些block(盒子)),留的盒子越多,可扩展性就越高 {% block top %} {% endblock %} -使用: -在一个新的html中 -{%extend 'base.html'%} -扩写留的对应的盒子 {% block top %} 扩写的内容 {% endblock %} -注意: 1 扩写的时候,盒子的位置无所谓,只要名字对应正确,就会正确填充 2 盒子可以不扩写,不写就是原来的样子 3 如果要显示母版盒子中原来的东西,需要 { {block.super}}----写在哪,原来的内容就放在哪 4 静态文件相关 1 直接写死的: 2 用static标签: {% load static %} 3 用get_static_prefix: {% load static %} 5 inclusion_tag:返回html片段 1 前面几步跟标签和过滤器一样 2 装饰器:@register.inclusion_tag('inclusiontag.html',name='lqz'),第一个参数是要操作的模板 3 返回一个字典,字典中的值,可以在inclusiontag中使用 4 使用: {%load 你写的那个py文件%} {% 函数名字 参数 参数 %} 6 模型层: 单表操作 -增加,删,改:两种方式:queryset对象的方法,book对象的方法 -改:需要用save() -get()方法:查询的数据有且只有一条,如果多,少,都抛异常 单表查询 -<1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序('-id') <6> reverse(): 对查询结果反向排序 <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <9> first(): 返回第一条记录 <10> last(): 返回最后一条记录 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct(): 从返回结果中剔除重复纪录 单表基于双下划线的模糊查询 Book.objects.filter(price__in=[100,200,300]) Book.objects.filter(price__gt100) Book.objects.filter(price__lt=100) Book.objects.filter(price__gte=100) Book.objects.filter(price__lte=100) Book.objects.filter(price__range=[100,200]) Book.objects.filter(title__contains="python") Book.objects.filter(title__icontains="python") Book.objects.filter(title__startswith="py") Book.objects.filter(pub_date__year=2012) 1 xx 12.3 2 xx 12.3 3 xxx 12.3 作业: 1 用inclusion_tag生成图书列表: 传个个数,吧数据库前几条数据显示出来 {% userlist 5%} 2 查询 1 查询老男孩出版社出版过的价格大于200的书籍 2 查询2017年8月出版的所有以py开头的书籍名称 3 查询价格为50,100或者150的所有书籍名称及其出版社名称 4 查询价格在100到200之间的所有书籍名称及其价格 5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重) 3 图书管理系统