1. 程式人生 > 其它 >django模板語法和模組層

django模板語法和模組層

django模板語法和模組層

模板語法之過濾器

# 過濾器(類似於內建函式)
過濾器從字面的意思上,可以理解為:過濾掉不需要的,剩下我們需要的
# 語法結構
{{ 資料物件|過濾器名稱:引數 }}  過濾器最多隻能額外傳輸一個引數

常見的過濾器

過濾器 過濾器說明
length 獲取資料的長度
add:'n' 算術加法或者字串加法
file_size,filesizeformat 將數字轉成合適的檔案計量單位
default 判斷當前資料物件對應的布林值
date:'Y-m-d' 時間格式化
slice:'0:8' 索引切片
truncatewords:5 按照空格擷取指定個數的文字
cut:' ' '移除指定的字元
safe 預設不對變數內的字串進行html轉義
<p>統計資料的長度:{{ s1|length }}</p>
    
<p>算術加法或者字串加法:{{ n1|add:111}}、{{ s1|add:'big baby' }}</p>
        
 <p>將數字轉成合適的檔案計量單位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat }}</p>
    
<p>時間格式化:{{ ctime|date:'Y-m-d' }}</p>
    
<p>索引切片:{{ s1|slice:'0:8' }}</p>
    
<p>按照空格擷取指定個數的文字:{{ s2|truncatewords:5 }}</p>
    
<p>按照字元個數擷取文字(包含三個點):{{ s2|truncatechars:5 }}、{{ s1|truncatechars:10 }}</p>

<p>移除指定的字元:{{ info|cut:'|' }}</p>
    
<p>是否取消轉換:{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>
    

模板語法之標籤

# 標籤
使用Django中的標籤可以在模板中做一些簡單的邏輯判斷。 標籤和{% %}配合使用

# 語法結構
  {% 名字 ...%}
  {% end名字 %}

# if 判斷
{% if 條件1 %}
    <p>內容1</p>
{% elif 條件2 %}
    <p>內容2</p>
{% else %}
    <p>內容3</p>
{% endif %}

# for迴圈
提供了forloop關鍵字
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
  
正常的for迴圈輸出
{% for i in l1 %}
    <p>{{ i }}</p>
{% endfor %}

# for+if 巢狀使用
 {% for i in l1 %}
    {% if forloop.first %}
        <p>這是第一次迴圈</p>
    {% elif forloop.last %}
        <p>這是最後一次迴圈</p>
    {% else %}
        <p>中間迴圈</p>
    {% endif %}
    {% empty %}
        <p>for迴圈物件為空 自動執行</p>
 {% endfor %}

# 字典的用法
'提供了keys、values、items方法'
user{name:'jason',age:18}

{% for foo in user %}
	{{ foo }} 	# name age
{{ endfor }}    

{% for foo in user.keys %}
	{{ foo }}   # name age
{{ endfor }}    

{% for foo in user.values  %}
	{{ foo }}   # jason 18
{{ endfor }}  

{% for foo in user.items %}
	{{ foo }}   # ('name','jason')('age',18)
{{ endfor }}    

自定義過濾器、標籤、inclusion_tag

# 自定義過濾器、標籤、inclusion_tag 的步驟
1.在應用下需要建立一個名為templatetags的資料夾

2.在該資料夾內建立一個任意名稱的py檔案

3.在該py檔案內需要先提前編寫兩行固定的程式碼
	from django import template
	register = template.Library()

自定義過濾器

# 自定義過濾器:只能接收兩個引數

@register.filter(is_safe=True) # 括號內name可以對過濾器命名呼叫
def index(a, b):
    return a + b

{% load mytag %}  # 載入自定義過濾器
{{ n1|index:333 }} # 使用自定義過濾器

自定義標籤

# 自定義簡單標籤:可以接收任意的引數
@register.simple_tag(name='my_tag')
def func1(a, b, c, d):
    return a + b + c + d
{% my_tag 1 2 3 4 %}  # 引數之間空格隔開即可

自定義inclusion_tag

# 自定義inclusion_tag
@register.inclusion_tag('left.html')
def func2(n):
    l1 = []
    for i in range(1, n + 1):
        l1.append(f'第{i}頁')
    return locals()
{% func2 10 %}

# left.html
<ul>
    {% for foo in l1 %}
        <li>{{ foo }}</li>
    {% endfor %}
</ul>
'''
該方法需要先作用於一個區域性html頁面 之後將渲染的結果放到呼叫的位置
'''

模組的匯入

# 模組的匯入
將頁面的某一個區域性當成模組的形式
哪個地方需要就可以直接匯入使用即可

# 模板匯入格式
{% include '匯入html檔名' %}

# 註釋語法補充
<!---->  是HTML的註釋語法
{##}	 是django模板語法的註釋
"""
HTML的註釋可以在前端瀏覽器頁面上直接檢視到
模板語法的註釋只能在後端檢視 前端瀏覽器檢視不了
"""

模組的繼承

# 繼承的概念
你需要事先在你想要使用的主頁面上劃定區域做好標記,之後在子頁面繼承的時候你就可以使用在主頁面劃定的區域,也就意味著,如果你不劃定任何區域,那麼你子頁面將無法修改主頁面內容

'有很多網站的很多頁面 其實都是差不多的 只是區域性有所變化 模板的繼承可以很好的實現該需求'
# 使用繼承流程原理
1.先在模板中通過block劃定將來可以被修改的區域
  {% block content %}
  	<h1>主頁內容</h1>
  {% endblock %}

2.子板繼承模板 利用block自動提示選取你想要修改的內容區域標記名稱
	{% extends 'home.html' %}
    
3.修改劃定的區域
	{% block content %}
    <h1>登入內容</h1>
	{% endblock %}
    
4.子頁面還可以重複使用父頁面的內容
	{{ block.super }}
"""
模板上最少應該有三個區域
	css區域、內容區域、js區域
子頁面就可以有自己獨立的css、js、內容
"""

模板繼承語法

1.繼承
{% extends '模版頁面名' %}

2.區域性修改
	# 1.你需要先去模版頁面中劃定可以被修改的區域
  	{% block '名字' %}
    	模版內容(666)
    {% endblock %}
  # 2.子頁面中即成了模版頁面之後 就可以根據名字修改
  	{% block '名字' %}
    	子版內容
      
# 子版頁面除了可以自己寫自己的之外 還可以繼續使用模版的內容
    {{ block.super }} 
    {% endblock %} 

前期資料準備

"""
django自帶的sqlite3資料庫 功能很少 並且針對日期型別不精確

1.資料庫正向遷移命令(將類操作對映到表中)
	python3 manage.py makemigrations
  python3 manage.py migrate
2.資料庫反向遷移命令(將表對映成類)
	python3 manage.py inspectdb
"""
需求
	我們只想操作orm 不想使用網路請求
  	需要有專門的測試環境
    1.自己搭建
    	import os
			if __name__ == "__main__":
    			os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
    			import django
    			django.setup()
    2.pycharm提供
    	python console