目錄
- 變量
- 過濾器
- 標簽
- 自定義過濾器與標簽
- 模板的導入
- 母版的繼承
- 靜態(tài)文件的導入
關于視圖函數(shù)的返回數(shù)據(jù)
之前是return render(request,'index.html',{'name':name})
, 需要將變量一個一個的傳入字典
locals() 會把該視圖函數(shù)內的變量,傳到模板
return render(request, 'index.html', locals())
1. 變量
{{ 變量名 }}
<p>字符串:{{ name }}</p>
<p>數(shù)字:{{ age }}</p>
<p>列表:{{ lis }}</p>
<p>元祖:{{ tu }}</p>
<p>字典:{{ dic }}</p>
{{ 函數(shù)名 }} 相當于print(函數(shù)名()) 打印函數(shù)的返回值 , 不能調用有參數(shù)的函數(shù)
對象:
<p>對象:{{ user }}</p> 打印了對象的內存地址
<p>對象:{{ user.name }}</p> 打印了對象的屬性
深度查詢
采用點的形式
<p>列表第0個值:{{ lis.0 }}</p>
<p>列表第3個值:{{ lis.3 }}</p>
<p>字典取值:{{ dic.name }}</p>
<p>對象方法:{{ user.get_name }}</p>
2. 過濾器
語法:{{ 參數(shù)|過濾器名字 }}
或 {{ 參數(shù)|過濾器名字:'第二個參數(shù)'}}
length: 統(tǒng)計字符串長度
<p>統(tǒng)計字符串長度:{{ 'hello world'|length }}</p>
default
<p>過濾器之默認值:{{ lis|default:'沒有值' }}</p>
filesizeformat : 將一串數(shù)字轉化為對應的數(shù)據(jù)大小 , eg: 1024 ==> 1 KB 1049000 ==> 1 MB
<p>過濾器之filesizeformat--1:{{ 1024|filesizeformat }}</p>
date :格式化時間
<p>過濾器之不使用date:{{ ctim }}</p>
<p>過濾器之date:{{ ctim|date:'Y-m-d' }}</p>
slice 切分 , 與python用法相同, 支持步長
<p>過濾器之slice:{{ lis|slice:'2:-1' }}</p>
{#支持步長#}
<p>過濾器之slice-字符串:{{ name|slice:'0:3:3' }}</p>
truncatechars 截取字符 , 剩余的部分以...
顯示 , 注意: ...
也算入截取的長度 , 所以 ,三個起步
<p>過濾器之truncatechars:{{ 'dafddfap'|truncatechars:5 }}</p>
結果 : da...
truncatewords 截取單詞 , 注意這個...
不算入長度
<p>過濾器之truncatewords:{{ '我 dfa ga dfs 你 dgf daf'|truncatewords:5 }}</p>
結果 : 我 dfa ga dfs 你...
safe 變量默認不解析 , 加上safe會被瀏覽器解析
{{ '<script>alert(666)</script>'|safe }}
add 傳兩個參數(shù) , 兩個數(shù)字 , 計算和 , 兩個字符串 ,拼接
<p>過濾器之用add:{{ 12|add:'1' }}</p>
<p>過濾器之用add:{{ 'egon'|add:'dsb' }}</p>
3. 標簽
for
語法
{% for i in lis %}
{% endfor %}
{% for foo in lis %}
{{ forloop }} ==> for循環(huán)特有標簽 , 只有在for標簽內才能使用
```
內容有
第一次循環(huán)的{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 5, 'revcounter0': 4, 'first': True, 'last': False}
最后一次循環(huán){'parentloop': {}, 'counter0': 4, 'counter': 5, 'revcounter': 1, 'revcounter0': 0, 'first': False, 'last': True}
```
{{% empty %}}當被循環(huán)的對象為空時走這一步
<p>被循環(huán)的對象為空啊</p>
{% endfor %}
只循環(huán)字典的話,取到的是key值
{% for foo in dic %}
取到value的值
{% for foo in dic.values %}
取到key 和 value的值
{% for k,foo in dic.items %}
if
語法
{% if 2 == 1 %}
{% elif 2 == 3 %}
{% else %}
{% endif %}
{% if user %}
<a href="">退出</a>
{% else %}
<a href="">登錄</a>
<a href="">注冊</a>
{% endif %}
with 相當于取別名,作用:變量太長,可以簡化
語法
{% with 原名 as 新名字 %}
{% endwith %}
{% with name as ttt %}
{{ ttt }}
{{ name }}
{% endwith %}
注意 : 過濾器,可以用在if判斷中使用 , 標簽不可以
4. 自定義過濾器與標簽
自定義過濾器
1 先在setting中注冊app
2 在app下創(chuàng)建一個templatetags(名字不能變)的文件夾(模塊)
3 在模塊下創(chuàng)建一個py文件,名字隨意:mytag.py
4 在此py文件里,
4.1 導入template
from django.template import Library
4.2 定義一個叫register的變量=template.Library()
register = Library() 變量名不能變
4.3 寫一個函數(shù),用@register.filter(name='yyy')裝飾一下(可以指定別名)
def str_add(str1, str2): #一定要有返回值
處理復雜的業(yè)務邏輯
return str1 + str2
5 定義完標簽以后重啟服務器
6 模板里使用
{% load mytag %} 將剛創(chuàng)建的py文件load過來
{{'lqz'|str_add:'nb'}} 使用
自定義標簽
與自定義過濾器用法類似
只需將4.3的裝飾器改為
@register.simple_tag()
def add_nb(value):
return value+'nb'
使用時 多個參數(shù)用空格隔開
<p>{% load mytag %}</p>
<p>{% add_nb 'lqz' %}</p>
5. 模板的導入
- 新建一個html文件 , 里面寫模板(組件)
- 在需要用到這個模板(組件)的地方
{% include '模板的名字'%}
注 , 模板的名字就是上一步html的文件名
6. 母版的繼承
例如導航欄, 側邊欄每個頁面都需要用到 , 寫一個母版 , 在每個頁面繼承這個母版就可以了
-
寫一個母版,留一個可擴展的區(qū)域(盒子),可以留多個盒子(留的越多,可擴展性越高)
{%block 名字%} 可以寫內容 {%endblock%}
-
在子模板中使用:
{% extends 'base.html' %} 繼承母版 {%block 名字%} 在母版區(qū)域填充的子模板的內容 在母版區(qū)域不是寫內容了嘛, 要是需要用到母版寫的內容用下面這個東西 {{ block.super }} {%endblock 名字%}
7. 靜態(tài)文件的導入
寫死靜態(tài)文件:
<link rel="stylesheet" href="/static/css/mycss.css">
-
使用 static標簽函數(shù):
{%load static%} #static返回值,會拼上傳參的路徑 {% static "css/mycss.css"%} eg: <link rel="stylesheet" href="{% static "css/mycss.css"%}">
-
使用get_static_prefix 標簽
{%load static%} #get_static_prefix返回值是:靜態(tài)文件的地址,相當于/static/ {% get_static_prefix %}css/mycss.css eg: <link rel="stylesheet" href="{% get_static_prefix %}css/mycss.css">