一.語法
關於模板渲染你只需要記兩種特殊符號:{{ }}和 {% %}
變量相關的用{{}},邏輯相關的用{%%}
二.過濾器
1.過濾器認識

1.過濾器的語法: {{ value|filter_name:參數 }} 2.使用管道符"|"來應用過濾器。 注意點: 1.過濾器支持“鏈式”操作。即一個過濾器的輸出作為另一個過濾器的輸入。 2.過濾器可以接受參數,例如:{{ sss|truncatewords:30 }},這將顯示sss的前30個詞。 3.過濾器參數包含空格的話,必須用引號包裹起來。比如使用逗號和空格去連接一個列表中的元素,如:{{ list|join:', ' }} 4.'|'左右沒有空格
2.過濾器方法使用
default
{{ value|default:"nothing"}} #如果一個變量是false或者為空,使用給定的默認值。 否則,使用變量的值。
length
{{ value|length }} #返回值的長度,作用於字符串和列表
filesizeformat
{{ value|filesizeformat }} #將值格式化為文件尺寸(例如 '13 KB', '4.1 MB', '102 bytes', 等等)
slice
#切片 {{value|slice:"2:-1"}}
date
#格式化,如果 value=datetime.datetime.now() {{ value|date:"Y-m-d H:i:s"}}
safe
#讓鏈接value = "<a href='#'>點我</a>" 渲染,加上safe {{ value|safe}}

{% autoescape off %} #同上safe作用 {{ obj }} {% endautoescape %}
truncatechars
#字符截斷,多余的使用...來表示 {{ value|truncatechars:9}} #注意:最后那三個省略號也是9個字符里面的
truncatewords
#截多少個單詞(通過空格截斷) {{ value|truncatewords:3}} #例如:‘hello girl hi baby yue ma’,結果是 'hello girl h1...'
cut
{{ value|cut:' ' }} #移除value中的所有空格
join
使用字符串連接列表,{{ list|join:', ' }},就像Python的str.join(list)
add
#value后邊添加2 {{ value|add:"2" }}
urlencode
{{ obj|urlencode }} 將obj編碼 http://www.baidu.com/ ->http%3A//www.baidu.com
三.標簽tags
語法
{% tag %}
...內容
{% endtag %}
1.for標簽
遍歷一個字典: {% for key,val in dic.items %} <p>{{ key }}:{{ val }}</p> {% endfor %}

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

#for 標簽帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,可以有所操作。 {% for person in person_list %} <p>{{ person.name }}</p> {% empty %} <p>sorry,no person here</p> {% endfor %}
2.if標簽
if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷,注意條件兩邊都有空格。
{% if num > 100 or num < 0 %} <p>無效</p> <!--不滿足條件,不會生成這個標簽--> {% elif num > 80 and num < 100 %} <p>優秀</p> {% else %} <!--也是在if標簽結構里面的--> <p>湊活吧</p> {% endif %}
3.with標簽
用於給復雜變量賦值
{% with total=business.employees.count %} {{ total }} <!--只能在with語句體內用--> {% endwith %}
4.csrf_token
在form表單點擊提交按鈕后,會出現Forbidden:CSRF verification failed. Request aborted,解決方法兩種
方法一:在settings.py中注釋掉 'django.middleware.csrf.CsrfViewMiddleware',
方法二:在form表單中 添加這個模板語言

<form action="/index/" method="post"> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="submit" value="submit"> {% csrf_token %} </form>
5.verbatim
#禁止render,也就是說傳給瀏覽器的內容是 {{hello}} {% verbatim %} {{ hello }} {% endverbatim %}
6.static
靜態文件引入
html文件上方 --{% load static%} <link href='{% static "css/b.css" %}'>
四.組件
可以將常用的頁面內容如導航條,頁尾信息等組件保存在單獨的文件中(如:navbar.html),然后在需要使用的地方按如下語法導入即可。
{% include 'navbar.html' %}
五.自定義filter和simple_tag
filter過濾器的主要形式:變量|函數,意思是將變量交給函數處理,而自定義filter就是自己定義函數,因為用到已有的很少。
1.自定義filter和simple_tag
1.在當前app中創建templatetags模塊(templatetags名稱固定)
2.在templatetags中創建.py文件,如my_tags.py

from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改變 #1.register.filter @register.filter def filter_multi(v1,v2): return v1 * v2 #2.register.simple_tag @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) #mark_safe保證生成標簽
3.在html中導入之前創建的my_tags.py:{% load my_tags%}
4.使用filter和simple_tags

{% load xxx %} #首行 1.使用filter,最多能傳2個參數 {{ num|filter_multi:2 }} #24 <!---最多2參數,能放在if for語句中---> {{ num|filter_multi:"[22,333,4444]" }} 2.使用simple_tag,能傳多個參數 {% simple_tag_multi 2 5 %} <!---參數不限,但不能放在if for語句中---> {% simple_tag_multi num 5 %}
自定義filter和simple_tag區別:

1.filter最多傳2參數,simple_tags能傳多個參數
2.filter的調用可寫在for/if語句中,simple_tags不可
{% if num|filter_multi:30 > 100 %}
{{ num|filter_multi:30 }}
{% endif %}
2.inclusion_tag

from django import template from django.utils.safestring import mark_safe register = template.Library() #Library首字母大寫 @register.inclusion_tag('index.html') def res(n1): return {"li":n1} #base.html中{% res li%}調用了res方法,將其li值作為參數傳遞給參數n1,因為有@register.inclusion_tag('index.html')的作用,將res的返回值{"li":n1}以render渲染方式給了index.html中的li變量,然后將index.html作為控件再被base.html引入。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% for i in li %} <p>{{ i }}</p> {% endfor %} </body> </html>

from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^base/',views.base), ]

from django.shortcuts import render,HttpResponse,rediret def base(req): li = [11,22,33] return render(req,"base.html",{"li":li})

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>母板</title> </head> <body> {% load my_tags %} <!---導入my_tags.py---> {% res li %} <!---調用my_tags.py中的res方法,將li傳值給它---> </body> </html>
六.模板繼承extends
我們在寫前端界面時,通常會遇到多個界面有相同的部分,那么如何避免這種問題的發生?就要用到模板繼承。繼承思路:(將不同界面中的共同部分取出來,單獨寫入一個html,作為母板,然后其他界面繼承於此界面)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>母板</title> </head> <body> <div> <!---div中的菜單為son1.html,son2.html的共同部分---> <p>菜單一</p> <p>菜單二</p> <p>菜單三</p> </div> {% block content %} 這里寫不同的部分 {% endblock %} </body> </html>

{% extends 'base.html' %} <!---繼承於base.html---> {% block content%} 這是son1 {% endblock %}

{% extends 'base.html' %}
{% block content%}
這是son2
{% endblock %}