在 Django 模板中遍歷複雜數據結構的關鍵是句點字符, 語法:{{ var_name }}css
var_name 是一個變量名稱,須要和views文件return第三個參數(字典)中的鍵一一對應。html
views.py中的內容:python
def index(request):jquery
# 變量裏的變量名等於return中的值,return的鍵要也模板{{ 值 }}的一一對應數據庫
s = "hello" # 一個變量django
list1 = ['one', 2, "three"] # 列表bootstrap
dict1 = {"name": "zero", "age": 18, "sex": "女"} # 字典緩存
class Person(object):安全
def __init__(self, name):數據結構
self.name = name # 類中的屬性
def eat(self): # 類中的方法
return "%s特別能吃" % self.name
person_ming = Person("ming") # 自定義類對象
person_hu = Person("hu")
person_xing = Person("xing")
person_list = [person_ming, person_hu, person_xing]
return render(request, "index.html", {
"snum": s,
"list": list1,
"dict": dict1,
"person_ming": person_ming,
"person_list": person_list,
})
templates下的index.html中body的內容:
<body>
<h1>哈哈哈哈</h1>
<hr>
<h2>一個變量:{{ snum }}</h2>
<hr>
<p>一個列表:{{ list }}</p>
<p>列表中的元素獲取第一個值:{{ list.0 }}</p>
<p>列表中的元素獲取第二個值:{{ list.1 }}</p>
<hr>
<p>一個字典:{{ dict }}</p>
<p>字典中的值:{{ dict.name }}</p>
{% for key,val in dict.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}
<hr>
<p>顯示的是一個對象:{{ person_ming }}</p>
<p>顯示的是一個對象中的屬性:{{ person_ming.name }}</p>
<p>顯示的是列表對象:{{ person_list }}</p>
<p>顯示列表對象中的第一個對象:{{ person_list.0 }}</p>
<p>顯示列表對象中的第二個對象的屬性:{{ person_list.0.name }}</p>
<p>顯示對象中的方法:{{ person_list.0.eat }}</p>
{#注意對象中的方法調用在模板中不須要(),和屬性相同便可被調用#}
</body>
注意:句點符也能夠用來引用對象的方法
如:
<h4>字典:{{ dict.name.upper }}</h4>
語法:{{obj|filter__name:param}} #param能夠有也能夠沒有
若是一個變量是false或者爲空,使用給定的默認值。不然,使用變量的值。特別注意True也直接顯示爲True。
語法:{{ value|length }}
返回值的長度。它對字符串和列表都起做用。
語法:{{ value|filesizeformat }}
value只能一個數值,其餘類型的值沒法讀取默認:
將值格式化爲一個 「人類可讀的」 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
若是 value 是 123456789,輸出將會是117.7 MB。
語法:{{ value|date:"Y-m-d" }}
根據給定的格式日期格式。
若是 now=datetime.datetime.now()
會輸出:2019-07-04 的格式
還有別的時間格式輸出:
{{ value|date }}
{{ value|date:"D d M Y" }}
{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}
語法:{{ value|truncatechars:10 }}
若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。
參數:要截斷的字符數
Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全。可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾符的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,若是是一個單獨的變量咱們能夠經過過濾器「|safe」的方式告訴Django這段代碼是安全的沒必要轉義。
語法:{{ value|safe }}
以上的例子爲下內容:
views.py內容爲:
def model_filter(request):
name1 = "hsz"
str_length = "I love three things. The sun ,the moon and you. " \
"The sun for the day. The moon for the night and you forever."
num = 12345
value = "<a href='http://www.baidu.com'>點擊</a>"
import datetime
now = datetime.datetime.now()
return render(request,"filter.html",{
# (1)default
"name01": name1,
"name02": False,
"name03": '',
"name04": True,
# (2)length
"str_lg": str_length,
# (3)filesizeformat
"str_fileszie": str_length,
"num_filesize": num,
# (4)date
"now": now,
# (5)truncatechars
"str_truncate": str_length,
# (6)safe
"sf_value": value,
})
相應的filter.html的body內容爲:
<body>
<p>(1)default</p>
<p>{{ name01|default:"zero"}}</p>
<p>{{ name02|default:"zero"}}</p>
<p>{{ name03|default:"zero"}}</p>
<p>{{ name04|default:"zero"}}</p>
<hr>
<p>(2)length</p>
<p>{{ str_lg|length }}</p>
<hr>
<p>(3)filesizeformat</p>
<p>{{ str_fileszie|filesizeformat }}</p>
<p>{{ num_filesize|filesizeformat }}</p>
<hr>
<p>(4)datetime</p>
<p>{{ now|date }}</p>
<p>{{ now|date:"Y-m-d" }} </p>
<p>{{ now|date:"D d M Y" }}</p>
<p>{{ now|date:"D d M Y" }} {{ now|time:"H:i" }}</p>
<hr>
<p>(5)truncatechars</p>
<p>截取50個字符</p>
<p>{{ str_truncate|truncatechars:50 }}</p>
<hr>
<p>(6)safe</p>
<p>{{ sf_value|safe }}</p>
</body>
標籤看起來像是這樣的: {% tag %}。標籤比變量更加複雜:一些在輸出中建立文本,一些經過循環或邏輯來控制流程,一些加載其後的變量將使用到的額外信息到模版中。一些標籤須要開始和結束標籤 (例如{% tag %} ...標籤 內容 ... {% endtag %})。
{% for pername in per_list %}
<p>名字爲:{{ pername}}</p>
{% endfor %}
<hr>
<p>for的反向循環</p>
{% for name in per_list reversed %}
<p>倒敘的名字爲:{{ name }}</p>
{% endfor %}
<p>遍歷一個字典</p>
<p>一我的的信息:</p>
{% for key,val in info_dict.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}
注:循環序號能夠經過{{forloop}}顯示
例:
<p>序號從1開始</p>
{% for i in loop_list %}
<p>{{ forloop.counter }}:{{ i}}</p>
{% endfor %}
序號從1開始
<p>{{ forloop.counter }}:{{ i.name }} === {{ i.eat }}</p>
序號從0開始
<p>{{ forloop.counter0 }}:{{ i.name }} === {{ i.eat }}</p>
倒序
<p>{{ forloop.revcounter }}:{{ i.name }} === {{ i.eat }}</p>
倒序,最後一個爲0
<p>{{ forloop.revcounter0 }}:{{ i.name }} === {{ i.eat }}</p>
例:(forloop.first):
{% for i in loop_list %}
{% if forloop.first %}
{{i}}
{% endif %}
{% endfor %}
例(forloop.last)2:
{% for i in loop_list %}
{% if forloop.last %}
{{ i }} <--這是最後一個數
{% else %}
{{ i }}|
{% endif %}
{% endfor %}
for 標籤帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,能夠有所操做。
例:
{% for num in em_list %}
<p>{{ num }}</p>
{% empty %}
<p>sorry,no num here</p>
{% endfor %}
{% if %}會對一個變量求值,若是它的值是「True」(存在、不爲空、且不是boolean類型的false值),對應的內容塊會輸出。
{% if num > 100 or num < 0 %}
<p>無效</p>
{% elif num > 80 and num < 100 %}
<p>優秀</p>
{% else %}
<p>湊活吧</p>
{% endif %}
使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個「昂貴的」方法(好比訪問數據庫)不少次的時候是很是有用的。(就至關於把值暫時保存)
<p>{{ per_list.2 }}</p>
{% with name=person_list.2 %}
<p>{{ name }}</p>
{% endwith %}
提交數據的時候就會作安全機制,當你點擊提交的時候會出現一個forbbiddon
的錯誤,就是用setting配置裏的scrf作安全機制的,那麼咱們能夠吧它給註釋了,,,
或者在form表單下面添加一個{% csrf_token %},,,
這纔是真正解決的辦法,註釋不是解決的辦法
<h3>scrf_token</h3><form action="/tag/" method="post">
{% csrf_token %}
<p><input type="text" name="haiyan"></p>
<input type="submit">
</form>
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# by hsz
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改變
@register.filter
def my_filter(v1, v2):
return v1 * v2
@register.simple_tag
def my_tag1(v1, v2, v3):
return v1 * v2 * v3
@register.simple_tag
def my_html(v1, v2):
temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
return mark_safe(temp_html)
{% load my_tags %}
{% load xxx %}
# num=12
{{ num|filter_multi:2 }} #24
{% simple_tag_multi 2 5 %}
{% simple_tag_multi num 5 %}
注:參數不限,但不能放在if for語句中
注意:filter能夠用在if等語句後,simple_tag不能夠
自定義過濾器函數的參數只能兩個,能夠進行邏輯判斷
自定義標籤無參數限制,不能進行邏輯判斷
{% if num|filter_multi:30 > 100 %}
{{ num|filter_multi:30 }}
{% endif %}
咱們本身導入的一些包就叫作靜態文件
STATIC_URL = '/static/'
#這個配置就至關於下面配置的別名,若是這裏的名字修改了就按照這裏的名字去導入
STATICFILES_DIRS = [
os.path.join(BASE_DIR,"mystatic"),
]
不要由於你建立的包名是mystatic而把下面路徑中的static修改掉,Django中只有你在setting已經配置了,那麼都是以static爲名,就至關於別名。
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
<link rel = "stysheet",href= "/static/css/index.css/">