Django-模板層

Django-模板層

模板語法之變量

    在Django模板中遍歷複雜數據結構的關鍵是句點字符,語法:css

{{var_name}}

views.py:html

import datetime

def index(request):
    s = "hello"
    l = [111, 222, 333]
    dic = {"name": "ethan", "age": 18}
    date = datetime.date(1993, 5, 2)

    class Person(object):
        def __init__(self, name):
            self.name = name

    person_ethan = Person("ethan")
    person_linda = Person("linda")
    person_tom = Person("tom")

    person_list = [person_ethan, person_linda, person_tom]

    return render(request, "index.html", {"l": l, "dic": dic, "person_list": person_list})

template:數據庫

<h4>{{s}}</h4>
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<h4>類對象列表:{{ person_list.0.name }}</h4>

    句點符也能夠用來引用對象的方法(無參數方法):django

<h4>字典:{{ dic.name.upper }}</h4>

模板語法之過濾器

    語法:緩存

{{ obj|filter_name: param }}

default

    若是一個變量是false或者爲空,使用給定的默認值。不然,使用變量的值。如:安全

{{ value|default: "nothing" }}

length

    返回值的長度,它對字符串和列表都起做用。如:數據結構

{{ value|length }}

    若是value是["a", "b", "c", "d"],那麼輸出爲4app

filesizeformat

    將值格式化爲一個"可讀的"文件尺寸(例如"13KB", "4.1MB", "102bytes",等等)。如:ide

{{ value|filesizeformat }}

    若是value是123456789, 輸出將會是117.7MBoop

date

    若是value = datetime.datetime.now()

{{ value|date: "Y-m-d" }}

slice

    若是 value = "hello world"

{{ value|slice: "2:-1" }}      llo worl

truncatechars

    若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列("...")結尾

    參數:要截斷的字符數

    如:

{{ value|truncatechars:9 }}

safe

    Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全。可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,若是是一個單獨的變量能夠經過過濾器"|safe"方式告訴Django這段代碼是安全的,沒必要轉義。如:

value = "<a href="">點擊</a>"

{{ value|safe }}

模板語法之標籤

for標籤

    遍歷每個元素:

{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor%}

    反向遍歷:

{% for obj in list reversed %}
    <p>{{ person.name }}</p>
{% endfor %}

     遍歷字典:

{% for key, val in dic.items %}
    <p>{{ key }}: {{ val }}</p>
{% endfor %}

     循環序號能夠經過{{ forloop }}顯示

forloop.counter            The current iteration of the loop  (1-indexed)
forloop.counter0           The current iteration of the loop  (0-indexed)
forloop.revcounter         The number of iterations from the end of the loop  (1-indexed)
forloop.revcounter0        The number of iterations from the end of the loop  (0-indexed)
forloop.first              True if this is the first time through the loop
forloop.last               True if this is the last time through the loop 

for ... empty

    for標籤帶有一個可選的{% empty %}從句,以便給出的組是空的或者沒有被找到時,能夠有所操做

{% for person in person_list %}
    <p>{{ person.name }}</p>
{% empty %}
    <p>sorry, no person here</p>
{% endfor %}

if標籤

    {% if %}會對一個變量求值,若是它的值是"True"(存在、不爲空、且不是boolean類型的false值),對應的內容塊會輸出

{% if num > 100 or num < 0 %}
    <p>無效</p>
{% elif num > 80 and num < 100 %}
    <p>優秀</p>
{% else %}
    <p>湊合吧</p>
{% endif %}

with 

    使用一個簡單的名字緩存一個複雜的變量,當須要使用一個"昂貴的"方法(好比訪問數據庫)不少次的時候是很是有用的

{% with total = business.employees.count %}
    {{ total }} employee {{ total|pluralize }}
{% endwith %}

csrf_token

    這個標籤用於跨站請求僞造保護

{% csrf_token %}

自定義標籤和過濾器

  • 在settings中的INSTALLED_APPS配置當前app,否則Django沒法找到自定義的simple_tag
  • 在app中建立templatetags模塊(模塊名只能是templatetags)
  • 建立任意.py文件,如:my_tags.py

自定義過濾器

# my_tags.py:
from django import template
from django.utils.safestring import mark_safe

register = template.Library()   # register的名字是固定的,不可改變


@register.filter
def filter_multi(v1, v2):
    return v1 * v2

自定義標籤

# my_tags.py:

@register.simple_tag
def simple_tag_multi(v1, v2):
    return v1 * v2

導入自定義過濾器和標籤文件

{% load my_tags %}

使用自定義過濾器和標籤

# num=12
{{ num|filter_multi:2}}   # 24


{% simple_tag_multi 2 5 %}    # 參數不限,但不能放在if for語句中

    filter能夠用在if等語句後,simple_tag不能夠

{% if num|filter_multi:30 > 100%}
    {{ num|filter_multi:30}}
{% endif %}

模板繼承(extend)

    模板繼承可讓您建立一個基本的"骨架"模板,它包含您站點中的所有元素,而且能夠定義可以被子模板覆蓋的blocks

    base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{%/span> endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

    子模板:

{% extends "base.html" %}
 
{% block title %}My amazing blog{% endblock %}
 
{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
  •  extends,它告訴模板引擎,這個模板"繼承"了另外一個模板(base.html),當模板系統處理這個模板時,首先,它將定位父模板
  • 子模板沒有定義的block,則使用父模板中的值。父模板的{% block %}標籤中的內容老是被用做備選內容。這種方式使代碼獲得最大程度的複用

使用繼承時:

  • 若是在模板中使用{% extends %}標籤,它必須是模板中的第一個標籤,其餘的任何狀況下,模板繼承都將沒法工做
  • 在base模板中設置越多的{% block %}標籤越好。子模板沒必要定義所有父模板中的blocks。能夠在父模板大多數blocks中填充合理的默認內容,子模板中只定義須要的那一個,多一點鉤子總比少一點好
  • 若是你發現你本身在大量的模板中複製內容,那可能意味着你應該把內容移動到父模板中的一個{% block %}中
  • 不能在一個模板中定義多個相同名字的block標籤
  • 爲了更好的可讀性,能夠給{% endblock %}標籤一個名字。在大型模板中,這個方法可幫助清楚看到哪個{% block %}標籤被關閉了。如:
{% block content %}
    ...
{% endblock content %}
相關文章
相關標籤/搜索