1. 程式人生 > >模板語言

模板語言

clu pub efault 停止 ria files lower 整除 cnblogs

django模板查找機制

  1. 先在settings指定的目錄下查找,
  2. django\contrib\admin\templates
  3. django\contrib\auth\templates
  4. 然後去每個app下的templates中查找
  5. 找到即停止查找,否則Template Not Found

屬性的訪問

使用 "." 來訪問變量的屬性 當模板系統遇到 "." 的查詢順序
  1. 字典查詢(Dictionary lookup)
  2. 屬性或方法查詢(Attribute or method lookup)
  3. 數字索引查詢(Numeric index lookup)

過濾器

使用管道符號 (|)來應用過濾器,如{{ name|lower }}將在變量 {{ name }} 使用 lower 過濾後再顯示它的值

{{ value2|safe }}     將字符串標記為在輸出之前不需要進一步的HTML轉義
{{ list|join:", "}}   列表轉字符串
{{ value|urlencode }} url編碼
{{ value|first }}     列表第一個元素
{{ value|last }}      列表最後一個元素
{{ value|random }}    隨機返回
{{ value|length }}    返回值的長度
{{ value
|length_is:"4" }} 如果值的長度是4,則返回True {{ value|linenumbers }} 顯示帶行號的文本 {{ value|default:"nothing" }} 如果 value沒有被提供,或者為空, 上面的例子將顯示“nothing”。 {{ value|filesizeformat }} 如果 value 是 123456789,輸出將會是 117.7 MB。 {{ value4|date:Y-m-d }} 轉換時間格式 {{ value2|add:3 }} value2+3 int類型 {{ value
|capfirst }} 大寫變量的第一個字母,django--> DjangoTemplates {{ value|cut:"-" }} 刪除字符串中的 "-" {{ value|dictsort:"name" }} 接受一個字典列表,並返回按參數中給出的鍵排序後的列表。 dictsortreversed 反序 {{ value|divisibleby:"3" }} 如果value可以被給出的參數整除,則返回 True {{ value|truncatechars:9 }} 如果字符串字符多於指定的字符數量,那麽會被截斷

詳情參考:http://python.usyiyi.cn/django/topics/class-based-views/index.html

自定義過濾器

文件結構 包含一個templatetags 目錄,和models.py、views.py等文件處於同一級別目錄下。
mysite/
├── blog
│   ├── __init__.py
│   ├── models.py
│   ├── templatetags
│   │   ├── blog_extras.py
│   │   └── __init__.py
│   └── views.py
在添加這個模塊以後,在模板裏使用標簽或過濾器之前你將需要重啟服務器。

定義filter

from django import template
register = template.Library()   

@register.filter(is_safe=True) # 只能接受兩個參數 def filter_multi(var,bar): # var是變量值, bar是選項值 return var * bar 模板文件 <!DOCTYPE html> {% load blog_extras %} # 導入定義的.py文件 <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>filter--->{{ x|filter_multi:20 }}</p> </body> </html>

自定義模板標簽

from django import template
register = template.Library() 

@register.simple_tag          # 可以接受多個參數
def simple_tag_multi(v1,v2,v):
    return  v1 * v2 * v


調用方法與filter相同

inclusion標簽

通過渲染另一個模板來顯示數據 定義標簽
# blog/templatetags/inclusion_tag.py
from django import template

register = template.Library()

@register.inclusion_tag(include.html)
def inc_test(xxx):
    value3 = [
        {"title":"aaa"},
        {"title":"bbb"},
        {"title":"ccc"}
    ]
    return {"value":value3}

用於渲染的模板

# include.html

<ul>
    {% for i in value %}
    <li>{{ i.title }}</li>
    {% endfor %}
</ul>

在父模板中載入

# base.html

{% load inclusion_tag %}
<h1>base</h1>
{% inc_test xxx %}

模板繼承

模板繼承可以創建一個基本的 “骨架” 模板 它包含站點中的全部元素 並且可以定義能夠被子模版覆蓋的block 當模板系統處理子模版時,首先定位父模板,並用子模版中的block替換掉父模板的block 使用方式
  1. 創建一個base.html控制整個站點的框架
  2. 站點的每個分支都創建一個父模板,最後繼承Base.html
  3. 為每種頁面類型創建獨立的模板
{% block title %} {% endblock %}            # 父模板中定義
{% extends "base.html" %}                   # 子模版繼承base.html
{% block titel %} <a>xxx</a> {% endblock %}  # 具體內容
{% include "public"}                         # 導入公共模板
{% include "public.html" with obj=uset_list}   # 傳入上下文對象

模板語言