07 django模板层
模板层
主要掌握以下几个知识点:
模板变量 {{var_name}}
过滤器 {{obj|filter__name:param}}
模板标签 {% tag %}
自定义过滤器和标签
模板继承
05 django模板层\django_template\templates\index.html
1 <!--!!!模板继承 重要!!!--> 2 <!--extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。--> 3 {% extends 'base.html' %} 4 5 <!--继承后,模版引擎注意到 base.html 中的两个 block 标签,并用子模版中的内容来替换这些block。--> 6 <!--为了更好的可读性,你也可以给你的 endblock 标签一个名字 。例如加的 title:--> 7 {% block title %} 8 <title>index</title> 9 {% endblock title%} 10 11 12 {% block content %} 13 <!--如果需要把继承模板的该部分内容带过来,写下这句话,不写则直接覆盖--> 14 {{ block.super }} 15 16 <h1>模板&标签</h1> 17 <hr> 18 <h2>模板变量</h2> 19 <p><strong>int</strong> {{ digits }}</p> 20 <p><strong>str</strong> {{ string }}</p> 21 <p><strong>lis</strong> {{ lis }}</p> 22 <p><strong>lis_items</strong> {{ lis.0 }} {{ lis.1 }}</p> 23 <p><strong>dic</strong> {{ dic }}</p> 24 <p><strong>dic_items</strong> {{ dic.name }} {{ dic.age }}</p> 25 <p><strong>jack</strong> {{ jack }}</p> 26 <p><strong>jack_items</strong> {{ jack.name }}</p> 27 <p><strong>person_lis</strong> {{ person_lis }}</p> 28 <p><strong>person_lis_items</strong> {{ person_lis.1.name }} {{ person_lis.1.age }}</p> 29 30 <hr> 31 <h2>过滤器</h2> 32 <!--default 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值--> 33 <p><strong>default</strong> {{ lis2|default:'nothing' }}</p> 34 <!--length 返回值的长度。它对字符串和列表都起作用--> 35 <p><strong>length</strong> {{ lis|length }}</p> 36 <!--filesizeformat 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '1 KB', '11.5 MB', '189 bytes')--> 37 <p><strong>filesizeformat</strong> {{ filesize|filesizeformat }}</p> 38 <!--date 可以按指定的日期格式 'Y-m-d H:m:s'--> 39 <p><strong>date</strong> {{ now|date:'H:m:s' }}</p> 40 <!--slice 切片 同list切片--> 41 <p><strong>slice</strong> {{ lis|slice:'2:' }}</p> 42 <!--truncatechars 截取字节长度,比如参数6,截取5个字节,剩下的用省略号表示--> 43 <p><strong>truncatechars</strong> {{ string|truncatechars:3 }}</p> 44 <!--truncatewords 截取单词,比如参数1,截取1个单词,剩下的用省略号表示--> 45 <p><strong>truncatewords</strong> {{ string|truncatewords:1 }}</p> 46 <!--safe 信任返回的数据,对特定的html或者js等的语句不转义--> 47 <p><strong>没有safe</strong> {{ ops }}</p> 48 <!--<p><strong>有safe</strong> {{ ops|safe }}</p>--> 49 50 <hr> 51 <h2>模板标签</h2> 52 <h3>for 标签</h3> 53 {% for i in person_lis %} 54 <!--{{forloop.counter}} 计数 从1开始 {{forloop.counter0}} 从0开始--> 55 <p>{{forloop.counter}} {{ i.name }}</p> 56 <p>{{forloop.counter}} {{ i.age }}</p> 57 <!--empty 标签 在for循环无数据的时候执行其逻辑--> 58 {% empty %} 59 <p>暂无数据!</p> 60 <!--结束标签--> 61 {% endfor %} 62 <h3>if 标签</h3> 63 {% if n > 18 %} 64 <p><strong>成年咯</strong></p> 65 {% elif n == 18 %} 66 <p><strong>刚成年</strong></p> 67 {% else %} 68 <p><strong>小屁孩</strong></p> 69 {% endif %} 70 <h3>with 标签</h3> 71 <!--等于命名一个变量,后面引用就好--> 72 {% with person_lis.1.name as name %} 73 <p>{{ name }}</p> 74 <p>{{ name }}</p> 75 <p>{{ name }}</p> 76 {% endwith %} 77 <h3>csrf_token 标签</h3> 78 <form action="" method="post"> 79 <!--django有安全机制,post请求会校验,如果没有下面的csrf_token标签,在请求后台的时候回403 Forbidden --> 80 <!--这个标签等于是在请求的index页面的时候,后台回有一个 csrf_token 字段,下次post请求的时候会和post参数一起传过去,后台校验token一致才会接受该post请求--> 81 {% csrf_token %} 82 <input type="text" name="user"> 83 <input type="password" name="pwd"> 84 <input type="submit"> 85 </form> 86 87 <hr> 88 <h2>自定义过滤器和标签</h2> 89 步骤: 90 <p>1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.</p> 91 <p>2、在app中创建templatetags模块(模块名只能是templatetags)</p> 92 <p>3、创建任意 .py 文件,如:my_tags.py</p> 93 <p>4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py</p> 94 {% load tag_filters %} 95 <!-- multi_filter 自定义过滤器 最多只能两个参数 --> 96 <p>{{ n|multi_filter:10 }} </p> 97 <!-- multi_tag 自定义标签 参数数量没有限制 --> 98 <p>{% multi_tag 10 100 %} </p> 99 <!--注意:filter可以用在if等语句后,simple_tag不可以--> 100 {% if n|multi_filter:10 > 100 %} 101 {{ n|multi_filter:10 }} 102 {% endif %} 103 104 <hr> 105 <h2>模板继承</h2> 106 <p>如果你在模版中使用模板继承extends标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作。</p> 107 <p>在base模版中设置越多的 block 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。</p> 108 <p>如果你发现你自己在大量的模版中复制内容,那可能意味着你应该把内容移动到父模版中的一个 block 中。</p> 109 <p>如果不想覆盖继承模板的盒子内容,想在其内容上增加内容,用 block.super </p> 110 {% endblock content%}
05 django模板层\django_template\templates\advertise.html
1 <div class="action"> 2 <div class="panel panel-danger"> 3 <div class="panel-heading">Panel heading without title</div> 4 <div class="panel-body"> 5 11111 6 </div> 7 </div> 8 <div class="panel panel-warning"> 9 <div class="panel-heading">Panel heading without title</div> 10 <div class="panel-body"> 11 22222 12 </div> 13 </div> 14 <div class="panel panel-success"> 15 <div class="panel-heading">Panel heading without title</div> 16 <div class="panel-body"> 17 3333 18 </div> 19 </div> 20 </div>
05 django模板层\django_template\templates\base.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 {% block title %} 6 <title>base——title</title> 7 {% endblock title %} 8 <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" 9 integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 10 <style type="text/css"> 11 *{ 12 padding: 0; 13 margin:0; 14 } 15 .header{ 16 width:100%; 17 height: 50px; 18 background-color: #369; 19 } 20 </style> 21 </head> 22 <body> 23 24 <div class="header"></div> 25 26 <div class="container"> 27 <div class="row"> 28 <div class="col-md-3"> 29 {% include 'advertise.html' %} 30 </div> 31 <div class="col-md-9"> 32 {% block content%} 33 <h3>base_content</h3> 34 {% endblock %} 35 </div> 36 </div> 37 </div> 38 39 </body> 40 </html>
05 django模板层\django_template\django_template\urls.py
from django.contrib import admin from django.urls import path, re_path, include urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^app01/', include(('app04.urls','app04'))), ]
05 django模板层\django_template\app04\urls.py
from django.urls import path, re_path from app04 import views urlpatterns = [ re_path(r'^index/', views.index), re_path(r'^base/', views.base), ]
05 django模板层\django_template\app04\views.py
from django.shortcuts import render,HttpResponse import datetime def index(request): # 模板变量 if request.method != 'POST': n = 18 digits = 123 string = 'hello world!' lis = [1,2,3,'a'] dic = {'name': 'xg','age':18, 'height':180} lis2 = [] filesize = 12345678 now = datetime.datetime.now() ops = "<script type='text/javascript'>alert('js脚本强制弹窗')</script>" class Person: def __init__(self,name,age): self.name = name self.age = age jack = Person('jack',22) rose = Person('rose',25) person_lis = [jack,rose] # person_lis = [] # return render(request, 'index.html',{'digits':digits,'string':string,'lis':lis,'dic':dic,'jack':jack,'rose':rose,'person_lis':person_lis}) # 如果变量太多,字典就很长了,所以这里可以写成locals() 将当前名称空间的变量都传给模板。 return render(request, 'index.html',locals()) else: print(request.POST) return HttpResponse('OJBK!') def base(request): return render(request, 'base.html')
05 django模板层\django_template\app04\templatetags\tag_filters.py
from django import template register = template.Library() @register.filter def multi_filter(x,y): return x*y @register.simple_tag def multi_tag(x,y): return x*y
夕闻道不如朝闻道