Django 模板層

Django模板層

後端向前端模板層發送數據的兩種方式css

第一種直接發送字典的形式:html

後端view視圖函數層
def index(request):
    name = 'ZhaoKang'
    return render(request,'index.html',{'name':name})

前端模板層:
<p>{{ name }}</p>  # 注意前端要拿後端發送過來的數據的時候必定要用{{}}來接收 而後取字典的鍵就能夠拿出值

方式二locals():前端

# locals() 將當前所在的名稱空間中的名字所有傳遞給前端頁面
後端view視圖層
def index(request):
    name = 'ZhaoKang'
    return render(request,'index.html',locals())
前端模板層
<p>{{ name }}</p>

不知道大家有沒有發現,我上面傳的是字符串類型,既然我上面傳的是字符串類型不防試試,數字類型(整型和浮點型),列表,字典,元祖,集合,函數,類,看看能不能傳到前端?python

後端視圖層
def index(request):
    name = 'ZhaoKang'
    age = 18
    salary = 16000.666
    l = [1,3.14,'zk',[1,2,3],{'name':'zk'},(1,2),{3,4}]
    dic = {'name':'zhaokang','age':18}
    t = (1,2)
    s = {1,2,3,4}
    def func():
        print(111)


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

        def index(self):
            return self.name

        @classmethod
        def func(cls):
            return cls

    obj = C('zhaokang')
    print(obj)
    return render(request,'index.html',locals())

前端模板層
<p>{{ name }}</p>  # ZhaoKang
<p>{{ age }}</p>  # 18
<p>{{ salary }}</p> # 16000.666
<p>{{ l }}</p> # [1, 3.14, 'zk', [1, 2, 3], {'name': 'zk'}, (1, 2), {3, 4}]
<p>{{ dic }}</p> # {'name': 'zhaokang', 'age': 18}
<p>{{ t }}</p> # (1, 2)
<p>{{ s }}</p> # {1, 2, 3, 4}
<p>{{ func }}</p> # None
<p>{{ obj }}</p> # <app01.views.index.<locals>.C object at 0x04178D90>

各類數據類型以及函數,類,都是能夠完成傳值的,可是有幾點問題git

第一:爲何函數拿到的結果是None,函數不是在被加括號的時候才能執行函數體內的代碼嗎,這裏我單獨拿出來試試。django

後端view層
    def func():
        return '你調用了我'
    前端模板層
    <p>{{ func }}</p> # 你調用了我

有沒有發現這裏返回的是「你調用了我」,因此這裏能夠得出結論是:後端傳函數名到前端,會自動加括號調用,且拿到的是函數的返回值。後端

注意:後端傳函數名到前端,會自動加括號調用,可是不支持傳參,若是不行不防能夠試試。app

第二:爲何後端傳對象到前端只能拿到一個內存地址呢?dom

由於後端傳對象到前端的時候自動會幫你打印這個對象。函數

還能夠經過對象點的方式拿到類裏面的屬性和方法,你信你試試

<p>{{ obj.name }}</p> # zhaokang
<p>{{ obj.func }}</p> # <class 'app01.views.index.<locals>.C'>
<p>{{ obj.index }}</p> # zhaokang

第三我列表,字典,元祖,集合,裏面有多個值我怎麼獲取到裏面的某個值呢。

<p>{{ l.0 }}</p> # 拿到的就是列表的第一個元素就至關於索引取值
<p>{{ t }}</p> # 元祖也是同樣經過 點索引的方式
<p>{{ s }}</p> # 集合也是同樣經過 點索引的方式
<p>{{ dic.name }}</p> # 幾點能夠經過點它的鍵的方式來獲取它的值

補充:字符串,列表,字典,元祖,集合能夠點出全部的內置方法的,不是全部的方法都是在前端能夠用的,只有那些不須要傳參的內置方法才能夠實現,好比字典 values(),items(),keys()

過濾器:

<p>前端統計字符串的長度:{{ l|length }}</p>  <!--結果爲7-->
flag = None # 我後端給flag設置值爲None
<p>前端獲取數據若是是空就返回default後面默認的參數值:{{ flag|default:'你這個東西是個空'}}</p>

<p>將數字格式化成表示文件大小的單位:{{ file_size|filesizeformat }}</p>
<p>格式化時間(不要加百分號){{ ctime|date:'Y-m-d' }}</p>
<p>字符串的切片操做:{{ res|slice:'0:8' }}</p>
<p>{{ res|slice:'0:8:2' }}</p> 從0開始到7個字符且步長爲2 至關於python中的切片顧頭不顧尾
<p>截取固定的長度的字符串 三個點也算:{{ res|truncatechars:10 }}</p>
<p>按照空格截取文本內容:{{ res|truncatewords:4 }}</p>
過濾器 描述 示例
upper 以大寫方式輸出 {{ user.name | upper }}
add 給value加上一個數值 {{ user.age | add:」5」 }}
addslashes 單引號加上轉義號
capfirst 第一個字母大寫 {{ ‘good’| capfirst }} 返回」Good」
center 輸出指定長度的字符串,把變量居中 {{ 「abcd」| center:」50」 }}
cut 刪除指定字符串 {{ 「You are not a Englishman」 | cut:」not」 }}
date 格式化日期
default 若是值不存在,則使用默認值代替 {{ value | default:」(N/A)」 }}
default_if_none 若是值爲None, 則使用默認值代替
dictsort 按某字段排序,變量必須是一個dictionary {% for moment in moments | dictsort:」id」 %}
dictsortreversed 按某字段倒序排序,變量必須是dictionary
divisibleby 判斷是否能夠被數字整除 {{ 224 | divisibleby:2 }} 返回 True
escape 按HTML轉義,好比將」<」轉換爲」&lt」
filesizeformat 增長數字的可讀性,轉換結果爲13KB,89MB,3Bytes等 {{ 1024 | filesizeformat }} 返回 1.0KB
first 返回列表的第1個元素,變量必須是一個列表
floatformat 轉換爲指定精度的小數,默認保留1位小數 {{ 3.1415926 | floatformat:3 }} 返回 3.142 四捨五入
get_digit 從個位數開始截取指定位置的數字 {{ 123456 | get_digit:’1’}}
join 用指定分隔符鏈接列表 {{ [‘abc’,’45’] | join:’’ }} 返回 abc45
length 返回列表中元素的個數或字符串長度
length_is 檢查列表,字符串長度是否符合指定的值 {{ ‘hello’| length_is:’3’ }}
linebreaks


標籤包裹變量

{{ 「Hi\n\nDavid」|linebreaks }} 返回

Hi

David

linebreaksbr
標籤代替換行符
linenumbers 爲變量中的每一行加上行號
ljust 輸出指定長度的字符串,變量左對齊 {{‘ab’|ljust:5}}返回 ‘ab ’
lower 字符串變小寫
make_list 將字符串轉換爲列表
pluralize 根據數字肯定是否輸出英文複數符號
random 返回列表的隨機一項
removetags 刪除字符串中指定的HTML標記 {{value | removetags: 「h1 h2」}}
rjust 輸出指定長度的字符串,變量右對齊
slice 切片操做, 返回列表 {{[3,9,1] | slice:’:2’}} 返回 [3,9] {{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’
slugify 在字符串中留下減號和下劃線,其它符號刪除,空格用減號替換 {{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23
stringformat 字符串格式化,語法同python
time 返回日期的時間部分
timesince 以「到如今爲止過了多長時間」顯示時間變量 結果可能爲 45days, 3 hours
timeuntil 以「從如今開始到時間變量」還有多長時間顯示時間變量
title 每一個單詞首字母大寫
truncatewords 將字符串轉換爲省略表達方式 {{ 'This is a pen' | truncatewords:2 }}返回``This is ...
truncatewords_html 同上,但保留其中的HTML標籤 {{ '<p>This is a pen</p>' | truncatewords:2 }}返回``<p>This is ...</p>
urlencode 將字符串中的特殊字符轉換爲url兼容表達方式 {{ ‘http://www.aaa.com/foo?a=b&b=c’ | urlencode}}
urlize 將變量字符串中的url由純文本變爲連接
wordcount 返回變量字符串中的單詞數
yesno 將布爾變量轉換爲字符串yes, no 或maybe {{ True | yesno }}{{ False | yesno }}{{ None | yesno }} ``返回 ``yes``no ``maybe

轉義和取消轉義:

當咱們在後臺寫一串字符串的寫的是前端html的標籤,而後在發送給前端這時咱們會發現獲得的根本不是咱們想要的,若是咱們寫一段html標籤前面也展現出來了,那就意味着別人就能夠實現腳本攻擊,對你的網站進行攻擊。

後端
def index(request):
    s = '<p>蒼茫的天涯是個人愛</p>'
    return render(request,'index.html',locals())
前端
{{ s }} # 打印結果是:<p>蒼茫的天涯是個人愛</p>

若是我就是想要我後端發一段前端html的代碼前端就顯示出,那怎麼辦呢,能夠經過safe來實現?

前端實現方式
{{ s|safe  }} <!--結果就是帶段落標籤的一段話了-->
後端實現方式
做爲調包俠確定想到的就是調包啊
from django.utils.safestring import mark_safe
s = mark_safe('<p>蒼茫的天涯是個人愛</p>')

標籤:

for循環

for循環
            {% for foo in l %}
                <p>{{ foo }}</p>
                <p>{{ forloop }}</p>
            {% endfor %}

if判斷

if判斷
            {% if flag %}
                <p>flag不爲空</p>
                {% else %}
                <p>flag是空</p>
            {% endif %}

嵌套使用

{% for foo in l %}
    {% if forloop.first %}
    <p>這是個人第一次</p>
    {% elif forloop.last %}
    <p>這是最後一次了啊</p>
    {% else %}
    <p>嗨起來!!!</p>
    {% endif %}
{% endfor %}

empty

empty
            當你的for循環對象爲空的時候會自動走empty代碼塊兒的內容
            後端:
                l = None
            前端:
            {% for foo in l %}
                {% if forloop.first %}
                    <p>這是個人第一次</p>
                {% elif forloop.last %}
                    <p>這是最後一次了啊</p>
                {% else %}
                    <p>嗨起來!!!</p>
                {% endif %}
                {% empty %}
                    <p>你給個人容器類型是個空啊,無法for循環</p>
            {% endfor %}

自定義過濾器:

必須作三件事情

1.在應用名下新建一個名爲templates文件夾(必須叫這個名字)

2.在新建的文件夾內新建一個任意名稱的py文件

3.在該py文件中須要固定寫下面兩句代碼

from django import template

register = template.Library()

自定義過濾器

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

前端使用

{% load templatetags %}
{{ 2|filter_multi:6 }} # 獲得的結果是12

注意:標籤用在{%%}裏面,過濾器用在{{}}裏面

自定義標籤:

後端

from django import template
from django.utils.safestring import mark_safe
register = template.Library()  # register的名字是不可變的固定寫法
@register.simple_tag() # 這裏能夠給個name='' 去別名 前端用的話直接拿別名就能夠了
def add1(a1,a2,a3):
    return a1+a2+a3  # 必定要有返回值

前端

{% add1 'zk' ' is' ' 很帥' %} 結果 zk is 很帥

注意:在你新定義一個標籤過濾器必定要從新django項目否則會拋異常

標籤是不能使用在if中的,而過濾器能夠

過濾器

{% if 2|filter_multi:6 %}
        <p>ok</p>  結果是ok
    {% endif %}

標籤

{% if add 'zk' 'is' '很帥' %}   這個地方直接就報錯了
<p>ok</p>
{% endif %}

模板的導入:

1 模版導入-->寫了一個好看的組件,能夠複用,
        1 寫一個模板
        2 在模板中:{% include '模板的名字'%}

2 模板的繼承
        1 寫一個母版,留一個可擴展的區域(盒子),能夠留多個盒子(留的越多,可擴展性越高)
            {%block 名字%}
                能夠寫內容
            {%endblock%}
        2 在子模板中使用:
            {%block 名字%}
                子模板的內容
            {%endblock 名字%}

3 靜態文件相關
        1 寫死靜態文件:<link rel="stylesheet" href="/static/css/mycss.css">
        2 使用 static標籤函數:
            -{%load static%}
            #static返回值,會拼上傳參的路徑
            -{% static "傳參"%}
        3 使用get_static_prefix 標籤
            -{%load static%}
            #get_static_prefix返回值是:靜態文件的地址,至關於/static/
            -{% get_static_prefix %}css/mycss.css
相關文章
相關標籤/搜索