一.簡介
模版是純文本文件。它可以產生任何基於文本的的格式(HTML,XML,CSV等等)。
模版包括在使用時會被值替換掉的 變量,和控制模版邏輯的 標簽。
{% extends "base_generic.html" %} {% block title %}{{ section.title }}{% endblock %} {% block content %} <h1>{{ section.title }}</h1> {% for story in story_list %} <h2> <a href="{{ story.get_absolute_url }}"> {{ story.headline|upper }} </a> </h2> <p>{{ story.tease|truncatewords:"100" }}</p> {% endfor %} {% endblock %}
1.變量
{{ variable }}
{#如果后台 渲染傳過來的是字典格式的數據 那么前端頁面解析值 dict={"k1":"v1"} 假設傳的是{"dict": dict} 前端頁面取值 .字典key值#} <h1>{{dict.k1}}</h1>
2.過濾器
可以通過使用 過濾器來改變變量的顯示
格式:
{{ name|lower }}
過濾器參數;
{{ item.content |truncatewords:30 }} <!-- 只顯示 content 變量的前30個詞 -->
default
{{ value|default:"nothing" }} <!--如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值-->
length
返回值的長度。它對字符串和列表都起作用
{{ value|length }}
filesizeformat
將該數值格式化為一個 “人類可讀的” 文件容量大小 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
{{ value|filesizeformat }}
add
把add后的參數加給value
{{ value|add:"2" }} <!--如果 value 為 4,則會輸出 6.-->
capfirst
將變量首字母變大寫
{{ value|capfirst }} <!--如果value是test過濾后轉為Test-->
cut
移除value中所有的與給出的變量相同的字符串
{{ value|cut:" " }}
dictsort
根據指定的key值對列表字典排序,並返回
{{ value|dictsort:"name" }}
{% for book in books|dictsort:"author.age" %}
* {{ book.title }} ({{ book.author.name }})
{% endfor %}
如給定值為:
[
{'title': '1984', 'author': {'name': 'George', 'age': 45}},
{'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
{'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]
那么結果為:
* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)
random
隨機返回一個值
{{ value|random }}
如果 value 是 列表 ['a', 'b', 'c', 'd'], 可能輸出的是 "b"
slice
切片
{{ some_list|slice:":2" }}
如果 some_list 是 ['a', 'b', 'c'], 輸出結果為 ['a', 'b']
truncatewords
字符串截斷
{{ value|truncatewords:2 }}
如果 value 是 "Joel is a slug",輸出 "Joel is ...".
二.自動HTML轉義
默認情況下,Django 中的每個模板會自動轉義每個變量的輸出。明確地說,下面五個字符被轉義:
- < 會轉換為<
- > 會轉換為>
- ' (單引號) 會轉換為'
- " (雙引號)會轉換為 "
- & 會轉換為 &
如何關閉
要控制模板上的自動轉義,將模板(或者模板中的特定區域)包裹在autoescape標簽 中
{% autoescape off %}
Hello {{ name }}
{% endautoescape %}
autoescape標簽接受on 或者 off作為它的參數。有時你可能想在自動轉義關閉的情況下強制使用它。下面是一個模板的示例:
Auto-escaping is on by default. Hello {{ name }}
{% autoescape off %}
This will not be auto-escaped: {{ data }}.
Nor this: {{ other_data }}
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}
自動轉義標簽作用於擴展了當前模板的模板,以及通過 include 標簽包含的模板,就像所有block標簽那樣。例如:
{% autoescape off %} <h1>{% block title %}{% endblock %}</h1> {% block content %} {% endblock %} {% endautoescape %}
{% extends "base.html" %} {% block title %}This & that{% endblock %} {% block content %}{{ greeting }}{% endblock %}
三.自定義simple_tag
自定義simple_tag
{% load humanize %}
{{ 45000|intcomma }}
load標簽可以接受多個庫名稱,由空格分隔。例如
{% load humanize i18n %}
5.1 自定義標簽代碼
自定義模板標簽和過濾器必須位於Django 的某個應用中。如果它們與某個已存在的應用相關,那么將其與應用綁在一起才有意義;否則,就應該創建一個新的應用來包含它。
這個應用應該包含一個templatetags 目錄,和models.py、views.py等文件處於同一級別目錄下,如果目錄不存在則創建它——不要忘記創建__init__.py 文件以使得該目錄可以作為Python 的包。在添加這個模塊以后,在模板里使用標簽或過濾器之前你將需要重啟服務器。新建 PY文件
切記:目錄名一定要是templatetags
#!/usr/bin/env python # -*- coding:utf-8 -*- from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag def my_simple_time(v1,v2,v3): return v1 + v2 + v3
在HTML中寫:
{% load xx %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% my_simple_time 1 2 3%} </body> </html>
在自定義simple_tag的html中不能用於if條件作為判斷,so引出了自定義過濾器函數
自定義過濾器函數
#!/usr/bin/env python # -*- coding:utf-8 -*- from django import template from django.utils.safestring import mark_safe register = template.Library() @register.filter def detail3(value,arg): allcount, remainder = arg.split(',') allcount = int(allcount) remainder = int(remainder) if value%allcount == remainder: return True return False
在HTML中寫:
{% load xx %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ 23|detail4:"4,0" }} {% if 23|detail4:"4,0" %} <h1>123</h1> {% endif %} </body> </html>