模板語法傳值
列表:l=['a','b','c']
集合:se{‘a’,'yy','ss'}
元組:t=(111,222,333)
render(request.'index,html',locals())
語法規律
{{}}:變量相關
{%%}:邏輯相關
{{func}}
會自動加括號執行,但不支持帶參數;
帶參數會不執行
{{my_class}}
會自動加括號執行(實例化)
總結:內部會判斷當前變量名是否可以加括號調用,如果可以就執行。針對函數名和類名
模板語法取值
d.hobby.3.info
1. 只能使用句點取值“.”, 可以混合使用。
2.“3”是索引,第三個的。
過濾器(最多兩個參數)
過濾器的語法: {{ value|filter_name:參數 }}
default
如果一個變量是false或者為空,使用給定的默認值。 否則,使用變量的值。
{{ value|default:"nothing"}}
如果value沒有傳值或者值為空的話就顯示nothing
length
返回值的長度,作用于字符串和列表。
{{ value|length }}
返回value的長度,如 value=['a',?'b',?'c',?'d']的話,就顯示4.
filesizeformat
將值格式化為一個 “人類可讀的” 文件尺寸 (例如?'13 KB'
,?'4.1 MB'
,?'102 bytes'
, 等等)。例如:
{{ value|filesizeformat }}
如果 value 是 123456789,輸出將會是 117.7 MB。
slice
切片
{{value|slice:"2:-1"}}
date
格式化
{{ value|date:"Y-m-d H:i:s"}}
safe
比如:
value = "<a href='#'>點我</a>"
{{ value|safe}}
truncatechars
如果字符串字符多于指定的字符數量,那么會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。
參數:截斷的字符數
{{ value|truncatechars:9}}
truncatewords
在一定數量的字后截斷字符串。
{{ value|truncatewords:9}}
cut
移除value中所有的與給出的變量相同的字符串
{{ value|cut:' ' }}
如果value為'i love you',那么將輸出'iloveyou'.
join
使用字符串連接列表,例如Python的str.join(list)
標簽
就是邏輯
for
#for
{% for user in user_list %}<li>{{ user.name }}</li>
{% endfor %}
for循環可用的一些參數:
Variable | Description |
---|---|
forloop.counter | 當前循環的索引值(從1開始) |
forloop.counter0 | 當前循環的索引值(從0開始) |
forloop.revcounter | 當前循環的倒序索引值(從1開始) |
forloop.revcounter0 | 當前循環的倒序索引值(從0開始) |
forloop.first | 當前循環是不是第一次循環(布爾值) |
forloop.last | 當前循環是不是最后一次循環(布爾值) |
forloop.parentloop | 本層循環的外層循環 |
for ... empty
對象是空,無法循環
{% for user in user_list %}<li>{{ user.name }}</li>
{% empty %}<li>空空如也</li>
{% endfor %}
if判斷
if,elif和
else
{% if user_list|length > 5 %}七座豪華SUV
{% else %}黃包車
{% endif %}
{% if user_list %}用戶人數:{{ user_list|length }}
{% elif black_list %}黑名單數:{{ black_list|length }}
{% else %}沒有用戶
{% endif %}
with
定義一個中間變量,多用于給一個復雜的變量起別名。
注意等號左右不要加空格。
#方法一
{% with business.employees.count as total %}{{ total }} employee{{ total|pluralize }}
{% endwith %}#方法二
{% with total=business.employees.count %}{{ total }} employee{{ total|pluralize }}
{% endwith %}
自定義過濾器、標簽
先三步走
1. 在應用下創建一個名字 “必須” 教templatetags文件夾
2. 在該文件夾內創建 “任意” 名稱的py文件 eg : mytag.py
3. 在該py文件內 “必須” 先書寫下面兩句話
from django import template
register = template.Library()
例子:
py文件:
from django import template
register = template.Library()#自定義過濾器,參數最多2個
@register.filter(name="cut")
def cut(value, arg):return value.replace(arg, "")@register.filter(name="addSB")
def add_sb(value):return "{} SB".format(value)#自定義標簽,可以多個參數@register.simple_tag(name="plus")
def index(a,b,c,d):return '%s-%s-%s-%s'%{a,b,c,d}
html文件:
#自定義過濾器
{# 先導入我們自定義filter那個文件 #}
{% load app01_filters %}{# 使用我們自定義的filter #}
{{ somevariable|cut:"0" }}
{{ d.name|addSB }}#自定義標簽,多個參數之間,用空格隔開
{% plus 'jason' 123 123 123 %}
inclusion_tag
"""
步驟1.在應用下創建一個名字必須為templatetags文件夾2.在該文件夾內,創建一個任意名稱的py文件3.在py文件內固定寫兩行代碼from django import templateregister = template.Library()"""
當HTML頁面某一個地方的頁面需要傳參數才能動態的渲染出來,
并且在多個頁面都需要使用該局部,那么就考慮將該局部頁面做成inclusion_tag形式。
templatetags/my_inclusion.py
from django import templateregister = template.Library()@register.inclusion_tag('result.html')
def show_results(n):n = 1 if n < 1 else int(n)data = ["第{}項".format(i) for i in range(1, n+1)]return {"data": data}#第二種return locals()
templates/snippets/result.html
<ul>{% for choice in data %}<li>{{ choice }}</li>{% endfor %}
</ul>
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>inclusion_tag test</title>
</head>
<body>{% load inclusion_tag_test %}{% show_results 10 %}
</body>
</html>
模版的繼承
note:所有模版,在后臺渲染后,返回前端。
在子頁面中
{% extends 'layouts.html' %}
塊(block)
通過在母板中使用{% block? xxx %}
來定義"塊"。
在子頁面中通過定義母板中的block名來對應替換母板中相應的內容。
{% block page-main %}<p>世情薄</p><p>人情惡</p><p>雨送黃昏花易落</p>
{% endblock %}
模板
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title>{% block page-css %}{% endblock %}
</head>
<body><h1>這是母板的標題</h1>{% block page-main %}{% endblock %}
<h1>母板底部內容</h1>
{% block page-js %}{% endblock %}
</body>
</html>
規律:一般模板內至少應該有三塊區域
css
html
js
補充:
使用模板的內容
{{block.supper}}
模板導入
頁面某個局部全部導入
{% include 'navbar.html' %}
引用:Django模板語言相關內容 - Q1mi - 博客園