Django模板渲染


一 . 語法

# 關於模板渲染只需要記住兩種語法就可以:
1.{{ }}  # 里面寫變量
2.{% %} # 里面寫與邏輯相關的,比如for循環

二 . 變量名

  在django的模板語言中按照語法: { { 變量名 } }   變量名只能是有數字,字母,下划線組成

  

 # views中

def index(request):
    import datetime
    s = "hello"
    l = [111, 222, 333]  # 列表
    dic = {"name": "yuan", "age": 18}  # 字典
    date = datetime.date(1993, 5, 2)  # 日期對象

    class Person(object):
        def __init__(self, name):
            self.name = name
        def dream(self):
            return 'dreamer'
    person_yuan = Person("chao")  # 自定義類對象
    person_egon = Person("yantao")
    person_alex = Person("jinxin")

    person_list = [person_yuan, person_egon, person_alex]

    return render(request, "index.html", {"l": l, "dic": dic, "date": date, "person_list": person_list})
    # return render(request,'index.html',locals())
    #locals()獲取函數內容所有的變量,然后通過render方法給了index.html文件進行模板渲染,如果你圖省事,你可以用它,但是很多多余的變量也被傳進去了,效率低
 # HTML文件中

<h4>{{s}}</h4>
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>

<!--取列表的第1個對象的name屬性的值-->
<h4>類對象列表:{{ person_list.0.name }}</h4>
<!--取列表的第1個對象的dream方法的返回值,如果沒有返回值,拿到的是none-->
<h4>類對象列表:{{ person_list.0.dream }}</h4>
注意:
    調用對象里面的方法的時候,不需要寫括號來執行,並且只能執行不需要傳參數的方法,如果你的這個方法需要傳參數,那么模板語言不支持,不能幫你渲染

三. 過濾器(django里面大約有60個)

  過濾器語法:{ { value|filter_name:參數 } }

  用管道符號' | ' 來應用過濾器.

  注意:

  1. '|' 左右沒有空格

  2.過濾器參數如果需要空格的話, 那么空格需要用' '(引號包裹起來), 比如說用逗號和空格去連接列表中的元素,如:{{list|join:', '}}

  這些命令都是寫在HTML里面的.

 # length
{{value|length}}
返回value的長度, 如 value=['a','b']的話,就顯示2
# 這個value是寫在views里面的, 上邊return render括號里面request后面的就是value
 # date
格式化,如果value=datetime.datetime.now()
{{ value|date:'Y-m-d }}   # 冒號后面是參數
 # safe
django為了避免用戶輸入一些HTML,js等代碼導致系統出問題(xss攻擊),所以在進行模板渲染的時候把所有的內容全部都轉義了,
都變成了字符串形式,即使是標簽也失去了意義. 但是我們要是想讓標簽等生效,需要通過過濾器"|safe"來實現.
  

   

  加了safe之后

   

  這個百度一下是個a標簽

 

 # truncatechars
# 字符串過多就會被截斷,截斷部分用省略號(...)結尾
# 參數就是截斷的字符數(非省略號部分)

{{ value|truncatechars:9}} #注意:最后那三個省略號也是9個字符里面的,
也就是這個9截斷出來的是6個字符+3個省略號,有人會說,怎么展開啊,配合前端的點擊事件就行啦
 # truncatewords
# 截取單詞,以空格為依據
# 例: I am very handsome boy. 這里有四個空格,就是五個單詞.

{{ value|truncatewords:3}}  #截取到I am very...

四 . 標簽Tags

  格式 : {% tag %}  標簽內容  {% endtag %}

  for 標簽

    寫一個for 然后直接tab鍵就可以

{% for person in person_list %}
    <p>{{ person.name }}</p>  <!--凡是變量都要用兩個大括號括起來-->
{% endfor %}

  可以利用{% for obj  in list  reserved %} 完成反向循環.

  遍歷字典

{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}

  注: 循環序號可以通過{{ forloop}} 顯示, 必須在循環內部使用

forloop.counter            當前循環的索引值(從1開始),forloop是循環器,通過點來使用功能
forloop.counter0           當前循環的索引值(從0開始)
forloop.revcounter         當前循環的倒序索引值(從1開始)
forloop.revcounter0        當前循環的倒序索引值(從0開始)
forloop.first              當前循環是不是第一次循環(布爾值)
forloop.last               當前循環是不是最后一次循環(布爾值)
forloop.parentloop         本層循環的外層循環的對象,再通過上面的幾個屬性來顯示外層循環的計數等

 

  for...empty

    for標簽有一個可選的{% empty %}從句,如果組是空的可以進行if判讀

{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

 

  if 標簽

{% if num > 100 or num < 0 %}
    <p>無效</p>  <!--不滿足條件,不會生成這個標簽-->
{% elif num > 80 and num < 100 %}
    <p>優秀</p>
{% else %}  <!--也是在if標簽結構里面的-->
    <p>湊活吧</p>
{% endif %}

  with(給變量起別名用的)

{% with total=business.employees.count %}
    {{ total }} <!--只能在with語句體內用-->
{% endwith %}

# 等號左右不能加空格

   或者

{% with business.employees.count as total %}
    {{ total }}
{% endwith %}

  csrf_token

csrf是防御機制,我們在以post提交表單的時候需要在表單里面寫{% csrf_token %},
表單提交的時候這個也跟着提交了,相當於通行證.

 

 五. 母版繼承

  

   操作結果對比

        

# 模板是哪個藍色的方框,都沒有變.

 六 . css, js bootstrap等樣式引入

 要想引入css Js bootstrap 等樣式,需要在項目下面建立一個static文件夾, 然后需要引入jquery文件.

  

 

  

 

前端頁面引入靜態文件的寫法,因為別名也可能會修改,所以使用路徑的時候通過load static來找到別名,通過別名映射路徑的方式來獲取靜態文件

 

 

七 . 自定義標簽和過濾器

# https://www.cnblogs.com/clschao/articles/10414811.html      第七條    

組件在第六條 其實就是{% include '一個HTML文件'%}, 把這個HTML文件的樣式應用到另個一個HTML文件中去

  1. 在setting中的INSTALL_APPS配置當前的App,不然django無法找到自定義的simple_tag.

  2. 在App的文件夾下創建templatetags模塊(名字必須是這個名字)

  3. 在templatetags中創建任意py文件,如:my_tag.py  

  

 @register.filter

  

  結果是:

  

 

@register.simple_tag

 

  

  結果是:

  

 

 

@register.simple_tag 可以傳標簽

 

   

  結果是:

  

 

register.filter  里面只能傳兩個參數,可以放到for循環或者if語句中 
register.simple_tag  可以傳多個參數,不能放到for循環里面,但是可以放到循環內容里面

   

   

  

@resister.inclusion_tag() 參數是HTML文件 多用於返回HTML代碼片段

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM