Django–模板層

1 模板簡介

將頁面的設計和python的代碼分離開會更乾淨建簡介維護。咱們可使用Django的模板系統(Template System)來實現
css

模板語法重點:

  變量:{{ 變量名 }}
         1 深度查詢
         2 過濾器
   標籤:{%  %}
html


模板語言分爲兩種:python

  • 過濾器:filter
  • 標籤:{%  %}

2 過濾器 filter

1 變量
     句點符,深度查詢(能夠點到方法,不要加括號,只能是無參的方法)數據庫

2 過濾器django

語法:  冒號後不能加空格,now是第一個參數,冒號後面是第二個參數緩存

{{obj|filter__name:param}}  變量名字|過濾器名稱:變量
例如:{{now|date:’Y-m-d H:i:s’}}

經常使用過濾器:app

default

若是一個變量是false或者爲空,使用給定的默認值。不然,使用變量的值。例如:xss

{{ value|default:"nothing" }}函數

length

返回值的長度。它對字符串和列表都起做用。例如:oop

{{ value|length }}

若是 value 是 ['a', 'b', 'c', 'd'],那麼輸出是 4。

filesizeformat

將值格式化爲一個 「人類可讀的」 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:

{{ value|filesizeformat }}

{{ 1024|filesizeformat }}

若是 value 是 123456789,輸出將會是 117.7 MB。  

date

若是 value=datetime.datetime.now()

{{ value|date:"Y-m-d H:i:s" }} 

slice

若是 value="hello world"

{{ value|slice:"2:-1" }}

truncatechars

若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。

參數:要截斷的字符數

例如:

{{ value|truncatechars:9 }}

safe

ss3="<a href="">點擊</a>"

{{ value|ss3}}

xss攻擊:跨站腳本攻擊

#能夠在視圖函數處理

from django.utils.safestring import mark_safe

ss3 = mark_safe(ss3)

add

倆參數能夠傳字符串和數字,    給value加上一個數值
add過濾器:  {{ 12|add:"3" }}
add過濾器:  {{ 'eee'|add:"3rrr" }}


其餘過濾器


過濾器1

過濾器2

過濾器3

3 標籤 Tag

標籤看起來像是這樣的: {% tag %}。標籤比變量更加複雜:一些在輸出中建立文本,一些經過循環或邏輯來控制流程,一些加載其後的變量將使用到的額外信息到模版中。一些標籤須要開始和結束標籤

(例如{% tag %} ...標籤 內容 ... {% endtag %})。

for標籤

遍歷每個元素:

{% for book in book_list %}

    <p>{{ book.name }}</p>  必須在for循環裏使用

{% endfor %}

能夠利用{% for obj in list reversed %} 反向完成循環

遍歷一個字典:

{% for key,val in dic.items %}

   <p>{{key}}:{{val}}</p>

{% endfor %}

循環序號能夠經過{{forloop }}實現

forloop.counter            The current iteration of the loop (1-indexed) 當前循環的索引值(從1開始)
forloop.counter0           The current iteration of the loop (0-indexed) 當前循環的索引值(從0開始)
forloop.revcounter         The number of iterations from the end of the loop (1-indexed) 當前循環的倒序索引值(從1開始)
forloop.revcounter0        The number of iterations from the end of the loop (0-indexed) 當前循環的倒序索引值(從0開始)
forloop.first              True if this is the first time through the loop 當前循環是否是第一次循環(布爾值)
forloop.last               True if this is the last time through the loop 當前循環是否是最後一次循環(布爾值)
forloop.parentloop         本層循環的外層循環

for…empty

for 標籤帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,能夠有所操做。

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

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

if 標籤

{% if %}會對一個變量求值,若是它的值是「True」(存在、不爲空、且不是boolean類型的false值),對應的內容塊會輸出。

{% if num > 100 or num < 0 %}
    <p>無效</p>
{% elif num > 80 and num < 100 %}
    <p>優秀</p>
{% else %}
    <p>湊活吧</p>
{% endif %}

if 語句支持 and 、or 、== 、> 、 < 、<= 、>= 、in 、not in 、is 、is not 判斷

with

使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個「昂貴的」方法(好比訪問數據庫)不少次的時候是很是有用的

{% with aa=dic.name%}
{{aa}}
{%endwith%}

能夠寫成as
{% with dic.name as aa%}
{{aa}}
{%endwith%}

csrf_token

{% csrf_token %}
這個標籤用於跨站請求僞造保護

4 自定義標籤和過濾器

  1. 在settings中的INSTALLED_APPS配置當前app,否則django沒法找到自定義的simple_tag.
  2. 在app中建立templatetags模塊(模塊名只能是templatetags)
  3. 建立任意 .py 文件,如:my_tags.py
from django import template      4. 導入template
from django.utils.safestring import mark_safe
 
register = template.Library()   #register的名字是固定的,不可改變  5.register
 
(6.寫函數 用@register.filter  @register.simple_tag 裝飾)   
@register.filter  過濾器
def filter_multi(v1,v2):
    return  v1 * v2

@register.simple_tag
def simple_tag_multi(x,y,z):
    return  x+y+z

----------------
能夠指定名字(可選)
@register.simple_tag(name=’xxx’)

7. 在使用自定義simple_tag和filter的html文件中導入以前建立的 my_tags.py

{% load my_tags %}

8. 使用simple_tag和filter(如何調用)

-------------------------------.html
{% load my_tags %}  
      
# num=12
{{ num|filter_multi:2 }} #24 最多隻能傳兩個參數
 
{% simple_tag_multi 2 5 10 %}  #17 以空格作分割,傳參數。 參數不限,但不能放在if for語句中
或者
{% xxx 2 5 10 %}

5 靜態文件引入的三種方式:

一:
    <link rel="stylesheet" href="/static/dd/ssmycss.css">
二:
    {% load static %}
    <link rel="stylesheet" href="{% static 'dd/ss/mycss.css' %}">
    {#    返回值:/static/dd/ss/mycss.css#}
三:
    {% load static %}
   <link rel="stylesheet" href="{% get_static_prefix %}dd/ss/mycss.css">

6 模板導入和繼承

模板導入:

1 把公共部分,放到html裏,好比叫 left.html
2 想在哪裏用 {% include '模板名稱' %}  如 {% include 'left.html' %}

模板繼承:

1 寫一個模板 base.html

2 要更改的地方

{% block base %}

   母版的盒子裏也能夠寫東西

{% endblock %}

3 調用

3.1 寫在第一行 {%extends 'base.html' %}
3.2         {% block base %}

            本身的東西
            
            {% endblock my_head%}
3.3 還想用母版裏的內容({{block.super}} 放在那,原來母版裏的東西,就會渲染在哪)
        {% block base %}
            {{block.super}}
            本身的東西                        
        {% endblock my_head%}
3.4 如過不繼承盒子,它會用原來的內容,若是繼承了,沒寫本身的東西,它會空白
3.5 盒子再繼承時,跟順序無關

7 自定義 inclusion_tag

多用於返回html代碼片斷

1 先去setting裏面把app名字配置上
2 再app目錄下建立一個templatetags模塊
3 寫py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 @register.inclusion_tag('test.html')
    def my_inclusion(n):
        data=[]
        for i in range(n):
            data.append('第%s行'%i)
        return {'data':data}
7 寫test.html頁面
            <ul>
              {% for choice in data %}
                <li>{{ choice }}</li>
              {% endfor %}

            </ul>
8 {% load my_test %}
9 {% my_inclusion 10 %}   它會返回html的頁面
相關文章
相關標籤/搜索