Django 模板層 靜態文件
阿新 • • 發佈:2018-11-12
統計字符 strong 內容 ews 引擎 靜態方法 utf-8 ati 字典
模版語法重點:
變量:{{ 變量名 }}
1 深度查詢 用句點符
2 過濾器
標簽:{{% % }}
模板語法之變量
在 Django 模板中遍歷復雜數據結構的關鍵是句點字符, 語法:{{變量名}}
index.html
{#模板語言註釋:前端看不到#} {#相當於print了該變量#} <h1>模板語言之變量</h1> <p>字符串:{{ name }}</p> <p>數字:{{ age }}</p> <p>列表:{{ ll }}</p> <p>元祖:{{ tu }}</p> <p>字典:{{ dic }}</p> {#只寫函數名:相當於函數名(),執行該函數#} <p>函數:{{ test }}</p> {#對象內存地址#} <p>對象:{{ lqz }}</p> <p>列表套對象:{{ person_list }}</p> <p>字典套對象:{{ person_dic }}</p> {#深度取值#} <p>列表第0個值:{{ ll.0 }}</p> <p>列表第3個值:{{ ll.3 }}</p> <p>字典取值:{{ dic.name }}</p> <p>字典取列表值:{{ dic.ll }}</p> {#再繼續取值,繼續點#} <p>對象取數據屬性:{{ lll.name }}</p> <p>對象取綁定給對象的函數屬性:{{ lll.get_name }}</p> <p>對象取綁定給類的函數屬性:{{ lll.cls_test }}</p> <p>對象取靜態方法:{{ lll.static_test }}</p> <p>把對象列表中egon年齡取出來:{{ person_list.1.age }}</p> {#拓展:不能調有參數的方法#} <p>字符串的方法:{{ name.upper }}</p>
views.py
def index(request): name = ‘lll‘ age = 18 ll = [1, 2, ‘lll‘, ‘egon‘] ll2=[] dic2={} tu = (1, 2, 3) dic = {‘name‘: ‘lll‘, ‘age‘: 18, ‘ll‘: [1, 2, 4]} # 函數 def test(): print(‘lll‘) return ‘zhouxiang dsb‘ # 在模板上相當於執行該函數,並打印 print(test()) # 類和對象 class Person(): def __init__(self, name, age): self.name = name self.age = age def get_name(self): return self.name @classmethod def cls_test(cls): return ‘cls‘ @staticmethod def static_test(): return ‘static‘ # 模板裏不支持帶參數 def get_name_cs(self,ttt): return self.name lll=Person(‘lll‘,18) fff=Person(‘fff‘,18) person_list=[lll,fff] person_dic={‘lll‘:lll} file_size=1024 import datetime ctim=datetime.datetime.now() h1=‘<h1>hello</h1>‘ script=‘<script>alert(111)</script>‘ user=‘‘ # return render(request,‘index.html‘,{‘name‘:name}) # locals() 會把*該*視圖函數內的變量,傳到模板 return render(request, ‘index.html‘, locals())
模板語法之過濾器
{{obj|filter__name:param}} 變量名字|過濾器名稱:變量
裏面變量可以參照上面的views.py
<h1>模板語言之過濾器</h1> {#後面就是個python中的函數,|前面的,是函數的第一個參數,冒號後面的是第二個參數#} <p>統計字符串長度:{{ name|length }}</p> <p>統計列表長度:{{ ll|length }}</p> <p>過濾器之默認值:{{ ll2|default:‘沒有值‘ }}</p> {# filesizeformat當前值或者傳入文件的大小 #} <p>過濾器之filesizeformat--1:{{ 1024|filesizeformat }}</p> <p>過濾器之filesizeformat--2:{{ file_size|filesizeformat }}</p> {# date 按Nov. 9, 2018這種格式輸出 ctim傳入的是datetime.datetime.now() #} <p>過濾器之不使用date:{{ ctim }}</p> <p>過濾器之date:{{ ctim|date:‘Y-m-d‘ }}</p> {#前閉後開區間 #} <p>過濾器之slice:{{ ll|slice:‘2:-1‘ }}</p> {#支持步長#} <p>過濾器之slice-字符串:{{ name|slice:‘0:3:3‘ }}</p> {#三個起步#} {# 取5-3個 剩下用三個點代替 #} <p>過濾器之truncatechars:{{ ‘dafdadaf‘|truncatechars:5 }}</p> {# 取三個如果有沒取盡的用三個 #} <p>過濾器之truncatewords:{{ ‘我 dfaf ga dfgaas 你 dgf adaf‘|truncatewords:5 }}</p> {# 有safe會解析傳過來的 html語句 沒有不解析 #} <p>過濾器之不用safe:{{ h1 }}</p> <p>過濾器之用safe:{{ h1|safe }}</p> <p>過濾器之不用safe:{{ script }}</p> {#<p>過濾器之用safe:{{ script|safe }}</p>#} {# add會讓兩個值相加,數字和字符串不會相加會報錯 字符串是拼接 數字是相加 #} <p>過濾器之用add:{{ 12|add:‘1‘ }}</p> <p>過濾器之用add:{{ ‘egon‘|add:‘dsb‘ }}</p>
模板語言之標簽
<h1>模板語言之標簽</h1> {% for foo in ll %} {{ forloop }} <p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p> {% endfor %} {% for foo in ll %} {% for i in person_list %} 取出外層是第幾次循環 {{ forloop.parentloop.counter }} <p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p> {% endfor %} {% endfor %} **************循環的對象是空,才會走到empty,而不是對象裏面的東西為空 {% for foo in dic2 %} <p>{{ foo }}</p> {% empty %} 傻逼了 {% endfor %} 只循環字典的話,取到的是key值 {% for foo in dic %} 取到value的值 {% for foo in dic.values %} 取到key 和 value的值 {% for k,foo in dic.items %} <p>{{ k }}----->{{ foo }}</p> {% empty %} 傻逼了 {% endfor %} {% if user %} <a href="">退出</a> {% else %} <a href="">登錄</a> <a href="">註冊</a> {% endif %} {#for循環判斷如果是第一次,打印第一次,其他打印正常值#} {% for foo in ll %} {% if forloop.first %} <p>第一次的我 </p> {% elif forloop.last %} <p>最後的我 </p> {% else %} <p>{{ foo }}</p> {% endif %} {% endfor %} <hr> with 相當於取別名,作用:變量太長,可以簡化 {% with name as ttt %} {{ ttt }} {{ name }} {{ user }} {% endwith %} ------ {% with dic.ll.2 as ttt %} {{ ttt }} {{ ttt }} {% endwith %} -for ,if,with 都要有結束
自定義標簽過濾器
<h1>自定義標簽過濾器</h1> {% load mytag %} {#傳多個參數的話:可以:‘aaa:bb:cc‘,也可以:傳列表#} <p>{{ ‘lqz‘|yyy:‘nb‘ }}</p> <h4>使用自定義的標簽</h4> <p>{% add_nb ‘egon‘ %}</p> <p>{% add_3 ‘egon‘ ‘is‘ ‘dsb‘ %}</p> <hr> 過濾器,可以用在if判斷中 {% if ‘lqz‘|yyy:‘nb‘ %} <p>肯定是True</p> {% endif %} 標簽不能用在if判斷(報錯)
模板導入與繼承
導入
模版導入-->寫了一個好看的組件,可以復用, 1 寫一個模板 2 在模板中:{% include ‘模板的名字‘%}
例如下面的兩個頁面代碼 導入 使用{% include ‘left.html’%} 就會將left.html內的html代碼導入到index內 在left內的標簽使用class定義樣式只要index內有定義那麽會被渲染上去。頁面解析的時候就相當於left。html的代碼存在於index 內
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> {% load static %} <link rel="stylesheet" href="{% static ‘utils/bootstrap-3.3.7-dist/css/bootstrap.css‘ %}"> <style type="text/css"> .head{ height: 100px; background:aquamarine; } .right-top{ margin-bottom: 10px; } </style> </head> <body> <div class="head"></div> <div class="container-fluid content"> <div class="row"> <div class="col-md-3"> {% include ‘left.html‘ %} </div> <div class="col-md-9"> <div class="right-top" style="background: pink;height: 50px"> {% block content_top %} {% endblock %} </div> <div class="right-middle" style="background: #d43f3a;height: 50px" > {% block content_middle %} {% endblock %} </div> {% block content_main %} 我是母版內容 {% endblock %} </div> </div> </div> </body> </html>index.html
<ul> <a href="{% url ‘temp1‘ %}"><li>a</li></a> <a href="{% url ‘temp2‘ %}"><li>b</li></a> <li>c</li> <li>d</li> <li>e</li> </ul>left.html
繼承
模板的繼承 1 寫一個母版,留一個可擴展的區域(盒子),可以留多個盒子(留的越多,可擴展性越高) {%block 名字%} 可以寫內容 {%endblock%} 2 在子模板中使用: {%block 名字%} 子模板的內容 {%endblock 名字%}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> {% load static %} <link rel="stylesheet" href="{% static ‘utils/bootstrap-3.3.7-dist/css/bootstrap.css‘ %}"> <style type="text/css"> .head{ height: 100px; background:aquamarine; } .right-top{ margin-bottom: 10px; } </style> </head> <body> <div class="head"></div> <div class="container-fluid content"> <div class="row"> <div class="col-md-3"> {% include ‘left.html‘ %} </div> <div class="col-md-9"> <div class="right-top" style="background: pink;height: 50px"> {% block content_top %} {% endblock %} </div> <div class="right-middle" style="background: #d43f3a;height: 50px" > {% block content_middle %} {% endblock %} </div> {% block content_main %} 我是母版內容 {% endblock %} </div> </div> </div> </body> </html>index.html
{% extends ‘index.html‘ %} {% block content_top %} <p>toptoptop</p> <p>toptoptop</p> {% endblock %} {% block content_middle %} <p>middle</p> <p>middle</p> {% endblock %} {% block content_main %} <p>main</p> <p>main</p> <p>main</p> {% endblock %}template1
{% extends ‘index.html‘ %} {% block content_top %} <p>temp2</p> <p>temp2</p> {% endblock %} {% block content_middle %} <p>temp2</p> <p>temp2</p> {% endblock %} {% block content_main %} <p>temp2</p> <p>temp2</p> <p>temp2</p> {% endblock %}template2
extends
標簽是這裏的關鍵。它告訴模版引擎,這個模版“繼承”了另一個模版。當模版系統處理這個模版時,首先,它將定位父模版——在此例中,就是“index.html”。
那時,模版引擎將註意到 index.html
中的兩個 block
標簽,並用子模版中的內容來替換這些block。
靜態文件
有時候項目進行更改的時候會更改static 相應的settings配置也會變更但是每個頁面也要變更就會增大工作量,所以就需要靜態文件配置
第一種方式 {% load static %} <link rel="stylesheet" href="{% static ‘css/mycss.css‘ %}"> 第二種方式 {% load static %} <link rel="stylesheet" href="{% get_static_prefix %}css/mycss.css">
Django 模板層 靜態文件