1. 程式人生 > >Django的模板層

Django的模板層

put ota light ice 我們 was 格式化 pps app

一 模板語法之變量

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

{{var_name}}

views.py:

def index(request):
import datetime s="hello" l=[111,222,333] # 列表 dic={"name":"yuan","age":18} # 字典 date = datetime.date(1993, 5, 2) # 日期對象 class Person(object): def __init__(self,name): self.name=name person_yuan=Person("molihua") # 自定義類對象 person_egon=Person("mlh") person_alex=Person("moli") person_list=[person_yuan,person_egon,person_alex] return render(request,"index.html",{"l":l,"dic":dic,"date":date,"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>

註意:句點符也可以用來引用對象的方法(無參數方法)

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

二 模板語法之過濾器

語法:
{{obj|filter__name:param}}

default

如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如:

{{ value|default:"nothing" }}

length

返回值得長度。它對字符串和列表都起作用

{{ value|length }}

例如:如果value的值為[‘a‘,‘b‘,‘c‘,‘d‘],那麽輸出的值就為4

filesizeformat

將值格式化為一個可讀的文件尺寸,如(13KB,4.1KB,100bytes等等)

{{ value|filesizeformat }}

如果value是123456789,那麽輸入的值就為117.7KB。

date

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

如果value=datetime.datetime.now() 那麽顯示的時間為當前時間

slice

如果 value =‘hello world’

那麽

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

結果為llo worl slice相當於切片

truncatechars

如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。

參數:要階段的字符數

例如:

{{ value|truncatechars:9 }}

如果一段英文是

When I was dreaming about you baby You were dreaming of me

那麽它會這麽顯示When I was dreaming about you baby You were....

safe

Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全.

但是有的時候我們可能不希望這些HTML元素被轉義.為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義

value="<a href="">點擊</a>"
	
{{ value|safe}}


加上|safe之後 a標簽會正常顯示成a標簽 有跳轉的功能 不會被轉義

三 模板之標簽

for標簽

遍歷每一個元素:

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

遍歷每一個字典:

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

註:循環序號可以通過{{forloop}}顯示

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

這個標簽用於跨站請求偽造保護

4 自定義標簽和過濾器(*****)

1、在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag.

2、在app中創建templatetags模塊(模塊名只能是templatetags)

3、創建任意 .py 文件,如:my_tags.py

from django import template
from django.utils.safestring import mark_safe
 
register = template.Library()   #register的名字是固定的,不可改變 必須是 template.Library() 
# 也就是說這句話是固定的
 
 
@register.filter     
#@register.filter    加上這個是自定義過濾器   這裏實現的是乘法
def filter_multi(v1,v2):
    return  v1 * v2
<br>


@register.simple_tag    
#自定義標簽 
def simple_tag_multi(v1,v2):
    return  v1 * v2
<br>
@register.simple_tag
def my_input(id,arg):
    result = "<input type=‘text‘ id=‘%s‘ class=‘%s‘ />" %(id,arg,)
    return mark_safe(result)

4、在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py

{% load my_tags %} 

5、使用simple_tag和filter(如何調用)

{% load xxx %}  
      
# num=12
{{ num|filter_multi:2 }} #24
 
{{ num|filter_multi:"[22,333,4444]" }}
 
{% simple_tag_multi 2 5 %}  參數不限,但不能放在if for語句中
{% simple_tag_multi num 5 %}

註意: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 %}

Django的模板層