Django(模板語言)


一.語法

關於模板渲染你只需要記兩種特殊符號:{{  }}和 {% %}

變量相關的用{{}},邏輯相關的用{%%}

二.過濾器

1.過濾器認識

1.過濾器的語法: {{ value|filter_name:參數 }}
2.使用管道符"|"來應用過濾器。

注意點:
    1.過濾器支持“鏈式”操作。即一個過濾器的輸出作為另一個過濾器的輸入。
    2.過濾器可以接受參數,例如:{{ sss|truncatewords:30 }},這將顯示sss的前30個詞。
    3.過濾器參數包含空格的話,必須用引號包裹起來。比如使用逗號和空格去連接一個列表中的元素,如:{{ list|join:', ' }}
    4.'|'左右沒有空格
 
過濾器認識

2.過濾器方法使用

default

{{ value|default:"nothing"}} #如果一個變量是false或者為空,使用給定的默認值。 否則,使用變量的值。

length

{{ value|length }} #返回值的長度,作用於字符串和列表

filesizeformat

{{ value|filesizeformat }}  #將值格式化為文件尺寸(例如 '13 KB', '4.1 MB', '102 bytes', 等等)

slice

#切片
{{value|slice:"2:-1"}}

date

#格式化,如果 value=datetime.datetime.now()
{{ value|date:"Y-m-d H:i:s"}}

safe

#讓鏈接value = "<a href='#'>點我</a>" 渲染,加上safe
{{ value|safe}}
 {% autoescape off %}             #同上safe作用
        {{ obj }}
    {% endautoescape %}
autoescape同上safe作用

 

truncatechars

#字符截斷,多余的使用...來表示
{{ value|truncatechars:9}} #注意:最后那三個省略號也是9個字符里面的

truncatewords

#截多少個單詞(通過空格截斷)
{{ value|truncatewords:3}} 
#例如:‘hello girl hi baby yue ma’,結果是 'hello girl h1...'

cut

{{ value|cut:' ' }}  #移除value中的所有空格

join

使用字符串連接列表,{{ list|join:', ' }},就像Python的str.join(list)

add

#value后邊添加2
{{ value|add:"2" }}              

urlencode

{{ obj|urlencode }} 將obj編碼  http://www.baidu.com/ ->http%3A//www.baidu.com

三.標簽tags

語法

{% tag %}
    ...內容
{% endtag %}

1.for標簽

遍歷一個字典:
{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}
forloop.counter            當前循環的索引值(從1開始),forloop是循環器,通過點來使用功能
forloop.counter0           當前循環的索引值(從0開始)
forloop.revcounter         當前循環的倒序索引值(從1開始)
forloop.revcounter0        當前循環的倒序索引值(從0開始)
forloop.first              當前循環是不是第一次循環(布爾值)
forloop.last               當前循環是不是最后一次循環(布爾值)
forloop.parentloop         本層循環的外層循環的對象,再通過上面的幾個屬性來顯示外層循環的計數等
循環序號可以通過{{forloop}}顯示
#for 標簽帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,可以有所操作。
{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}
for...empty以便在給出的組是空的或者沒有被找到時,可以有所操作

2.if標簽

if語句支持 andor、==、>、<、!=、<=、>=、innot inisis not判斷,注意條件兩邊都有空格。
{% if num > 100 or num < 0 %}
    <p>無效</p>  <!--不滿足條件,不會生成這個標簽-->
{% elif num > 80 and num < 100 %}
    <p>優秀</p>
{% else %}  <!--也是在if標簽結構里面的-->
    <p>湊活吧</p>
{% endif %}

3.with標簽

用於給復雜變量賦值

{% with total=business.employees.count %}
    {{ total }} <!--只能在with語句體內用-->
{% endwith %}

4.csrf_token

在form表單點擊提交按鈕后,會出現Forbidden:CSRF verification failed. Request aborted,解決方法兩種

方法一:在settings.py中注釋掉  'django.middleware.csrf.CsrfViewMiddleware',

方法二:在form表單中 添加這個模板語言

<form action="/index/" method="post">
    <input type="text" name="" id="">
    <input type="text" name="" id="">
    <input type="submit" value="submit">
    {% csrf_token %}
</form>
form表單添加{% csrf_token %}

5.verbatim

#禁止render,也就是說傳給瀏覽器的內容是 {{hello}}
{% verbatim %}
         {{ hello }}
{% endverbatim %}

6.static

靜態文件引入

html文件上方 --{% load static%}
<link href='{% static "css/b.css" %}'>

 

四.組件

可以將常用的頁面內容如導航條,頁尾信息等組件保存在單獨的文件中(如:navbar.html),然后在需要使用的地方按如下語法導入即可。

{% include 'navbar.html' %}

五.自定義filter和simple_tag

filter過濾器的主要形式:變量|函數,意思是將變量交給函數處理,而自定義filter就是自己定義函數,因為用到已有的很少。

1.自定義filter和simple_tag

1.在當前app中創建templatetags模塊(templatetags名稱固定

2.在templatetags中創建.py文件,如my_tags.py

from django import template    
from django.utils.safestring import mark_safe
register = template.Library()   #register的名字是固定的,不可改變

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

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

@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)   #mark_safe保證生成標簽        
my_tags.py

3.在html中導入之前創建的my_tags.py:{% load my_tags%}

4.使用filter和simple_tags

{% load xxx %}   #首行
    
1.使用filter,最多能傳2個參數    
{{ num|filter_multi:2 }} #24 <!---最多2參數,能放在if for語句中--->  
{{ num|filter_multi:"[22,333,4444]" }}

2.使用simple_tag,能傳多個參數
{% simple_tag_multi 2 5 %}  <!---參數不限,但不能放在if for語句中--->
{% simple_tag_multi num 5 %}
base.html

自定義filter和simple_tag區別:

1.filter最多傳2參數,simple_tags能傳多個參數
2.filter的調用可寫在for/if語句中,simple_tags不可
{% if num|filter_multi:30 > 100 %}
    {{ num|filter_multi:30 }}
{% endif %}
自定義filter和simple_tag區別

2.inclusion_tag

from django import template
from django.utils.safestring import mark_safe

register = template.Library()  #Library首字母大寫

@register.inclusion_tag('index.html')
def res(n1):
    return {"li":n1}
#base.html中{% res li%}調用了res方法,將其li值作為參數傳遞給參數n1,因為有@register.inclusion_tag('index.html')的作用,將res的返回值{"li":n1}以render渲染方式給了index.html中的li變量,然后將index.html作為控件再被base.html引入。
templatetags文件夾下的my_tags.py文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% for i in li %}
    <p>{{ i }}</p>
{% endfor %}
</body>
</html>
index.html
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^base/',views.base),       
]
urls.py
from django.shortcuts import render,HttpResponse,rediret
def base(req):
    li = [11,22,33]
    return render(req,"base.html",{"li":li})
views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>母板</title>
</head>
<body>
{% load my_tags %}     <!---導入my_tags.py--->
{% res li %}     <!---調用my_tags.py中的res方法,將li傳值給它--->
</body>
</html>
base.html

 

 

 

六.模板繼承extends

我們在寫前端界面時,通常會遇到多個界面有相同的部分,那么如何避免這種問題的發生?就要用到模板繼承。繼承思路:(將不同界面中的共同部分取出來,單獨寫入一個html,作為母板,然后其他界面繼承於此界面)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>母板</title>
</head>
<body>
<div>                    <!---div中的菜單為son1.html,son2.html的共同部分--->
    <p>菜單一</p>
    <p>菜單二</p>
    <p>菜單三</p>
</div>
{% block content %} 
    這里寫不同的部分
{% endblock %}
</body>
</html>
母板base.html
{% extends 'base.html' %}      <!---繼承於base.html--->

{% block content%}
    這是son1
{% endblock %}
son1.html
{% extends 'base.html' %}

{% block content%}
    這是son2
{% endblock %}
son2.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM