主要掌握如下幾個知識點:javascript
模板變量 {{var_name}}css
過濾器 {{obj|filter__name:param}}html
模板標籤 {% tag %}java
自定義過濾器和標籤git
模板繼承django
05 django模板層\django_template\templates\index.htmlbootstrap
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>一、在settings中的INSTALLED_APPS配置當前app,否則django沒法找到自定義的simple_tag.</p> 91 <p>二、在app中建立templatetags模塊(模塊名只能是templatetags)</p> 92 <p>三、建立任意 .py 文件,如:my_tags.py</p> 93 <p>四、在使用自定義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.htmlapp
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.pyoop
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