Django的模板層
一 模板語法之變量
在Django模板中遍歷復雜數據結構的關鍵是句點字符,語法:
{{var_name}}
views.py:
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 person_yuan=Person("molihua") # 自定義類對象 person_egon=Person("mlh") person_alex=Person("moli") person_list=[person_yuan,person_egon,person_alex] return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})
template:
<h4>{{s}}</h4> <h4>列表:{{ l.0 }}</h4> <h4>列表:{{ l.2 }}</h4> <h4>字典:{{ dic.name }}</h4> <h4>日期:{{ date.year }}</h4> <h4>類對象列表:{{ person_list.0.name }}</h4>
註意:句點符也可以用來引用對象的方法(無參數方法)
<h4>字典:{{ dic.name.upper }}<
/
h4>
二 模板語法之過濾器
語法:{{obj|filter__name:param}}
default
如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如:
{{ value|default:"nothing" }}
length
返回值得長度。它對字符串和列表都起作用
{{ value|length }}
例如:如果value的值為[‘a‘,‘b‘,‘c‘,‘d‘],那麽輸出的值就為4
filesizeformat
將值格式化為一個可讀的文件尺寸,如(13KB,4.1KB,100bytes等等)
{{ value|filesizeformat }}
如果value是123456789,那麽輸入的值就為117.7KB。
date
{{ value|date:"Y-m-d" }}
如果value=datetime.datetime.now() 那麽顯示的時間為當前時間
slice
如果 value =‘hello world’
那麽
{{ value|slice:"2:-1" }}
結果為llo worl slice相當於切片
truncatechars
如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。
參數:要階段的字符數
例如:
{{ value|truncatechars:9 }}
如果一段英文是
When I was dreaming about you baby You were dreaming of me
那麽它會這麽顯示When I was dreaming about you baby You were....
safe
Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全.
但是有的時候我們可能不希望這些HTML元素被轉義.為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義
value="<a href="">點擊</a>" {{ value|safe}} 加上|safe之後 a標簽會正常顯示成a標簽 有跳轉的功能 不會被轉義
三 模板之標簽
for標簽
遍歷每一個元素:
如: {% for person in person_list %} <p>{{ person.name }}</p> {% endfor %}
遍歷每一個字典:
{% for key,val in dic.items %} <p>{{ key }}:{{ val }}</p> {% endfor %}
註:循環序號可以通過{{forloop}}顯示
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 %}
with
使用一個簡單地名字緩存一個復雜的變量,當你需要使用一個“昂貴的”方法(比如訪問數據庫)很多次的時候是非常有用的
例如:
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
csrf_token
這個標簽用於跨站請求偽造保護
4 自定義標簽和過濾器(*****)
1、在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag.
2、在app中創建templatetags模塊(模塊名只能是templatetags)
3、創建任意 .py 文件,如:my_tags.py
from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改變 必須是 template.Library() # 也就是說這句話是固定的 @register.filter #@register.filter 加上這個是自定義過濾器 這裏實現的是乘法 def filter_multi(v1,v2): return v1 * v2 <br> @register.simple_tag #自定義標簽 def simple_tag_multi(v1,v2): return v1 * v2 <br> @register.simple_tag def my_input(id,arg): result = "<input type=‘text‘ id=‘%s‘ class=‘%s‘ />" %(id,arg,) return mark_safe(result)
4、在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py
{% load my_tags %}
5、使用simple_tag和filter(如何調用)
{% load xxx %} # 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 %}
註意:filter可以用在if等語句後,simple_tag不可以
{% if num|filter_multi:30 > 100 %} {{ num|filter_multi:30 }} {% endif %}
五 模板繼承(extend)
模版繼承可以讓您創建一個基本的“骨架”模版,它包含您站點中的全部元素,並且可以定義能夠被子模版覆蓋的 blocks 。
通過從下面這個例子開始,可以容易的理解模版繼承:
base.html
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}My amazing site{%/span> endblock %}</title> </head> <body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body> </html>
字模板
{% extends "base.html" %} {% block title %}My amazing blog{% endblock %} {% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
Django的模板層