Django(三):模板語言

  • 1、提要
  • 2、Filters
  • 3、Tags
  • 4、母版和繼承
  • 5、組件的使用和注意事項
  • 6、靜態路徑的寫法
 
 
1、提要:

 
1.官方文檔:
 
2.引入三種特殊符號:
變量相關的用 {{ }} ,邏輯相關的用 {% %}  , . )在模板語言中有特殊的含義,用來獲取對象的相應屬性值
 
3.模板中支持的寫法:
{# 取list中的第一個參數 #}
{{ list.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取對象的name屬性 #}
{{ person_list.0.name }}
 
 
2、Filters

語法: {{ value|filter_name:參數 }}
 
1.defalut:
{{ value|default: "nothing"}}
若是value值沒傳的話就顯示nothing
 
2.length:
{{ value|length }}
返回value的長度,如 value=['a', 'b', 'c', 'd']的話,就顯示4.
 
3.filesizeformat:
{{ value|filesizeformat }}
將值格式化爲一個 「人類可讀的」 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。若是 value 是 123456789,輸出將會是 117.7 MB。
 
4.slice
{{value|slice:"2:-1"}}
切片
 
5.data:
{{ value|date:"Y-m-d H:i:s"}}
格式化
 
6.safe:
Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全。可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾符的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,若是是一個單獨的變量咱們能夠經過過濾器「|safe」的方式告訴Django這段代碼是安全的沒必要轉義。
下面只會顯示點我
value = "<a href='#'>點我</a>"
{{ value|safe}}
 
7.truncatechars:
{{ value|truncatechars:9}}
參數:截斷的字符數
若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。
 
8.自定義filter:
a.自定義filter代碼文件擺放位置:
app01/
    __init__.py
    models.py
    templatetags/   # 在app01下面新建一個templatetags文件
        __init__.py   若是沒有這個就手動建立
        app01_filters.py  # 建一個存放自定義filter的文件,名字隨意
    views.py
b. 編寫自定義filter
from django import template
#生成一個註冊用的實例
register = template.Library()
 
定義並註冊一個自定義的filter函數
@register.filter(name="cut")
def cut(value, arg):
    return value.replace(arg, "")
 
 
@register.filter(name="addSB")
def add_sb(value):
    return "{} SB".format(value)
c. 使用自定義filter
{# 先導入咱們自定義filter那個文件 #}
{% load app01_filters %}
 
{# 使用咱們自定義的filter #}
{{ somevariable|cut:"0" }}
{{ d.name|addSB }}
 
 
3、Tags

 
1.for:
<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>
 
2.for循環可用的一些參數:
Variable
Description
forloop.counter
當前循環的索引值(從1開始)
forloop.counter0
當前循環的索引值(從0開始)
forloop.revcounter
當前循環的倒序索引值(從1開始)
forloop.revcounter0
當前循環的倒序索引值(從0開始)
forloop.first
當前循環是否是第一次循環(布爾值)
forloop.last
當前循環是否是最後一次循環(布爾值)
forloop.parentloop
本層循環的外層循環
另外,for循環也能夠寫入到class中,如:
<ul>
    {% for name in name_list %}
        <li class='{% if forloop.first %}'sb'{% endif %}'>{{ forloop.revcounter }}-{{ name }}</li>
    {% endfor %}
</ul>
#這段代碼會把第一個的屬性變成sb
 
3.for...empty:
<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>
 
4.if..elif和else:
{% if user_list %}
  用戶人數:{{ user_list|length }}
{% elif black_list %}
  黑名單數:{{ black_list|length }}
{% else %}
  沒有用戶
{% endif %}
{% if user_list|length > 5 %}
  七座豪華SUV
{% else %}
    黃包車
{% endif %}
 
5.with:
{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
    #在這裏能夠用total
{% endwith %}
#定義一箇中間變量,
 
 
4、母版和繼承

 
1.首先寫母版:
# base.html
<!DOCTYPE html>
<html>
<head>
    <title>母版</title>
</head>
<body>
<div>
    <p>母版內容</p>
    <p>圖書管理系統</p>
</div>
 
<div>
     {% block page-main %}
        #這裏是要替換的地方
        #其他的方法都會被繼承
    {% endblock %}
</div>
</body>
</html>
 
2.而後是要繼承母版的子頁面:
# insert1.html
#繼承的母版
{% extends 'base.html' %}
 
{% block page-main %}
    <h3>我是書籍頁頁面的自定義內容1,用來替換母版中指定的位置</h3>
    #這裏的內容會被替換到母版中
{% endblock %}
 
 
3.關於母版中幾個列表的切換問題的解決方法:
<li {% if publisher_list %} class='active' {% endif %}><a href="/publisher_list/">出版社列表</a></li>
<li {% if all_book %} class='active' {% endif %}><a href="/book_list/">書籍列表</a></li>
<li {% if author_list %} class='active' {% endif %}><a href="/author_list/">做者列表</a></li>
或者:
<li class="{% block publisehr_class %}{% endblock %}"><a href="/publisher_list/">出版社列表</a></li>
<li class="{% block book_class %}{% endblock %}"><a href="/book_list/">書籍列表</a></li>
<li class="{% block author_class %}{% endblock %}"><a href="/author_list/">做者列表</a></li>
 
 
 
5、組件的使用和注意事項

1.將使用次數多的組件提取出來,保存到xiaohei.html文件中;
2.在須要添加組件的地方,寫入這個:
{% include 'xiaohei.html' %}
 
 
6、關於靜態文件路徑的寫法

{% load static %}
<img src="{% static "images/hi.jpg" %}"/>
1.會去settings.py裏面查找靜態文件夾的別名,幫你拼接具體的靜態文件的路徑
 
2.某個文件多處被用到能夠存爲一個變量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
 
3.使用get_static_prefix本身拼接路徑:
{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
或者:
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}
 
<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" /><img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
 
4.自定義simpletag:
a.自定義filter代碼文件擺放位置:
app01/
    __init__.py
    models.py
    templatetags/   # 在app01下面新建一個package package
        __init__.py
        mysimpletag.py  # 建一個存放自定義simpletag的文件,名字隨意
    views.py
b. 編寫自定義simpletag
from django import template
#生成一個註冊用的實例
register = template.Library()
 
@register.simple_tag(name='yimi')
def my_sum(arg1, arg2, arg3):
    return '{} {} {}'.format(arg1, arg2, arg3)
c. 使用自定義simpletag
{# 先導入咱們自定義filter那個文件 #}
{% load mysimpletag%}
 
{# 使用咱們自定義的simpletag #}
{% yimi 'wangzhen' 'changjiang' '12314' %}
#傳入三個參數
 
5.inclusion_tag:
多用於返回html代碼片斷
實例: templatetags/my_inclusion.py
from django import template
 
register = 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}
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>
相關文章
相關標籤/搜索