Django -- template(模板語言)

1.變量

語法格式 : {{ name }}    # 使用雙大括號來引用變量

 1.Template和Context對象(不推薦使用)html

from django.template import Context, Template
 t = Template('My name is {{ name }}.')
 c = Context({'name': 'Stephane'})
 t.render(c)
# in HTML
'My name is Stephane.'

 2.深度變量查找(萬能的據點號)python

Python中:
a = [1,2,3]
b = {"a":"123","b":"456"}
 
HTML中:
<span>{{ a.1 }}</span>
<span>{{ a.1 }}</span>
<span>{{ b.a }}</span>
<span>{{ b.b }}</span>

 3.變量的過濾器(filter)的使用django

語法格式:    {{ obj|fil1.add              給變量加上相應的值
2.addslashes    給變量中的引號前加上斜線
3.capfirst         首字母大寫
4.cut               從字符串中移除指定的字符
5.date             格式化日期字符串
6.default          若是值是空,就替換成設置的默認值,不然就是用原本的值
7.default_if_none   若是值是None,就替換成設置的默認值,不然就使用原本的值
8.{% autoescape off %}
        {{ name }}
   {% endautoescape %}     將name中的字符串按照HTML的規則來渲染
9.upper和lower          將文檔轉化成大寫或小寫
10.truncatewords       顯示前n個單詞(英文)
11.urlizetrunc            顯示前n個字符(英文)
12.slice                     相似於python的切片操做
13.center                  輸出指定長度字符串並把值對中
14.filesizeformat        格式化,使其成爲易讀的文件大小,例如:13KB,4.1MB等。
15.first和last              返回第一個/最後一個
16.length                  返回長度
17.join                      將列表用指定的字符拼接
 
# value1 = 2  ;res: 5
<span>{{ value1|add:3 }}</span>
 
# value2 = "al'e'x"   ;res: al\'e\'x
<span>{{ value2|addslashes }}</span>
 
# value3 = "hello"   ;res: Hello
<span>{{ value3|capfirst }}</span>
 
# value4 = "nihao"   ;res: niao
<span>{{ value4|cut:"h"  }}</span>
 
# value5 = [ Python中的Datetime類型 ]
<span>{{ value5|date:"Y-m-d H:i:s" }}</span>  res: 2018-12-18 17:59:07
<span>{{ value5|date }}</span>                       res:2018年12月18日
 
#value6 = []   ;res: 空
<span>{{ value6|defult:"否" }}</span>
 
#value7 = None   ;res : 空
<span>{{ value7|default_if_none:"空" }}</span>
 
#value8 = "<h3>點擊這裏<a href='www.baidu.com'>跳轉</a></h3>"
{% autoescape off %}
     {{ value8 }}
{% endautoescape %}
 
#value9 = "YEllow"
<span>{{ value9|upper }}</span>   
<span>{{ value9|lower }}</span>
 
#value10 = "when i was young"
<span>{{ value10|truncatewords:"3" }}</span>
<span>{{ value10|urlizetrunc:"3" }}</span>
 
#value11 = "當我年輕的時候"
<span>{{ value11|slice:":2" }}</span> 取前兩個字(支持漢字)
<span>{{ value11|slice:"2:" }}</span> 從2開始作切片
<span>{{ value11|center:"50" }}</span>
 
#value12 = 2048
<span>{{ value12|filesizeformat }}</span>
 
#value13 = [2018,10,24]
<span>{{ value13|join:"-" }}</span>ter:param }}

 2.標籤(tag)的使用

格式:  {% tags %}

 ①{% if %}app

{% if %} 標籤接受and,or或者not來測試多個變量值或者否認一個給定的變量
{% if %} 標籤不容許同一標籤裏同時出現and和or,不然邏輯容易產生歧義,例以下面的標籤是不合法的:
 錯誤示例:  {% if obj1 and obj2 or obj3 %}
 
{% if num >= 100 and 8 %}
    {% if num > 200 %}
        <p>num大於200</p>
    {% else %}
        <p>num大於100小於200</p>
    {% endif %}
{% elif num < 100%}
    <p>num小於100</p>
{% else %}
    <p>num等於100</p>
{% endif %}

 ②{% for %}框架

<ul>
{% for obj in list %}
    <li>{{ obj.name }}</li>
{% empty %}
    <div>this is empty</div>
{% endfor %}
</ul>
#在標籤裏添加reversed來反序循環列表:
{% for obj in list reversed %}
   ...
{% endfor %}

模板for不支持中斷循環,也不支持continue,但內置了一個forloop模板變量oop

  • forloop.counter         表示循環的次數,從1開始
  • forloop.counter0       從0開始計數
  • forloop.revcounter    當前循環的倒數計數,最後一個值爲1
  • forloop.revcounter0   最後一個值爲0
  • forloop.first       布爾值,判斷是不是循環的第一個元素
  • forloop.last       布爾值,判斷是不是循環的最後一個元素

循環字典:測試

{% for i in dict.keys %}     循環全部的key值
{% for i in dict.values %}   循環全部的value值
{% for row in dict.items %} 獲得元組
{% for key,value in dict.items %}  獲得一一對應的key-value

 ③{% csrf_token %} : csrf_token標籤this

 用於生成csrf_token的標籤,用於防治跨站攻擊驗證。注意若是你在view的index裏用的是render_to_response方法,不會生效url

 其實,這裏是會生成一個input標籤,和其餘表單標籤一塊兒提交給後臺的。spa

④{% url %} 引用路由配置的地址

<form action="{% url "bieming"%}" >
       <input type="text">
       <input type="submit"value="提交">
       {%csrf_token%}
</form>

 ⑤{% with %} 用更簡單的變量名替代複雜的變量名

{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}

 ⑥{% verbatim %}: 禁止render

{% verbatim %}
         {{ hello }}
{% endverbatim %}

 ⑦{% load %}: 加載標籤庫

3.自定義filter和simple_tag

a、在app中建立templatetags文件夾

b、建立.py文件,好比my_tags.py

from django import template
from django.utils.safestring import mark_safe
 
register = template.Library()   #register的名字是固定的,不可改變
 
@register.filter
def filter_multi(v1,v2):
    return  v1 * v2
 
@register.simple_tag
def simple_tag_multi(v1,v2):
    return  v1 * v2
 
@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

c、在使用自定義simple_tag和filter的html文件中導入以前建立的 my_tags.py :{% load my_tags %}

d、使用simple_tag和filter(如何調用)

in HTML
{% load my_Tag %}   #首行
 
 # num=12
{{ num|filter_multi:2 }} #24
 
{{ num|filter_multi:"[22,333,4444]" }}
 
 
{% simple_tag_multi 2 5 %}  參數不限,但不能放在if for語句中
{% simple_tag_multi num 5 %}

e、在settings中的INSTALLED_APPS配置當前app,否則django沒法找到自定義的simple_tag

注意:filter能夠用在if等語句後,simple_tag不能夠

{% if num|filter_multi:30 > 100 %}
    {{ num|filter_multi:30 }}
{% endif %}

4.模板的包含和繼承

包含:{% include 'nav.html' %}容許在模板中包含其餘模板的內容

繼承:本質上說,模版繼承就是先構造一個基礎框架模版,然後在其子模版中對它所包含站點共用部分和定義進行重載。

注意:

        1 包含和繼承能夠把一些共用的網頁模塊獨立出來,以減小代碼的冗餘。

        2  若是在模塊裏使用{% extends %}d的話,這個標籤必須在全部模版標籤的最前面,不然模版繼承不工做。

        3  一般儘量模版裏的{% block %}越多越好,子模版沒必要定義全部的父block

        4  若是你須要父模版的塊內容,{{block.super}}變量能夠幫你完成工做,當你須要爲父塊添加內容而不是取代它的時候這就頗有用。

        5  不能在同一模版(不管是父模版仍是子模版)裏定義多個同名{% block %} ,由於塊標籤同時在兩個地方工做,不只在子模版中,並且在父模版中也填充內容,若是子模版有兩個同名的標籤,父模版將不能決定使用哪個塊內容來使用。

相關文章
相關標籤/搜索