1. 程式人生 > >模板層

模板層

safe 24* 特殊 如果 輸入 前端 tor eat locals

filter
{{}}
    1 變量
        1 句點符,深度查詢 
        2 可以點到方法,不要加括號,只能是無參的方法 
        3 xss跨站腳本攻擊: 比如提交評論<script>alert(dsb)</script> 存到數據庫 響應到html 瀏覽器解釋 就會彈窗 如果for循環一千次或者多次 頁面就崩了
         這就是xss攻擊  所以一定要處理
        如果不要django處理(比如:<用&gt; 替換) 
        就要顯示標簽可以這樣處理:
            1 ss3=mark_safe(ss3)        from
django.utils.safestring import mark_safe 在views中 2 <p>safe過濾器: {{ ss3|safe }}</p> html中
       3 @register.simple_tag(is_safe=False) 默認是true,防止xss攻擊,顯示字符串。false瀏覽器直接解釋標簽 自定義標簽時設置false
2 過濾器 冒號後不能加空格 now是第一個參數,冒號後面是第二個參數
<p>date過濾器 {{ now|date:Y-m-d:H:i:s }}</p> <p>date過濾器 {{ now|date }}</p> 如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如: <p>default過濾器 {{ ss2|default:字符串沒有值 }}</p> <p>default過濾器 {{ ll3|default:列表沒有值 }}</p> 返回值的長度。它對字符串和列表都起作用
<p>length過濾器 {{ ll2|length }}</p> 將值格式化為一個 “人類可讀的” 文件尺寸 單位是B (例如 13 KB, 4.1 MB, 102 bytes, 等等)。例如: <p>filesizeformat過濾器 {{ file|filesizeformat }}</p> <p>filesizeformat過濾器 {{ 1024|filesizeformat }}</p> 切片操作 <p>slice過濾器 {{ lqzisbig|slice:1:9 }}</p> 如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾 帶空格的字符串不算點的數量 不帶空格的字符串算點的數量 <p>truncatechars過濾器 {{ lqzisbigdddddddeee|truncatechars:9 }}</p> <p>truncatewords過濾器: {{ lqz is big and egon is small|truncatewords:3 }}</p xss攻擊:跨站腳本攻擊 1 在html中處理 <p>safe過濾器: {{ ss3|safe }}</p> 2 {#也可以在視圖函數裏處理#} from django.utils.safestring import mark_safe ss3=mark_safe(ss3) 倆參數可以傳字符串和數字,具體詳見源碼 <p>add過濾器: {{ 12|add:"3" }}</p> <p>add過濾器: {{ eee|add:"3rrr" }}</p> tag {% %} for :forloop {%for i in ll%} #必須再for循環裏使用 {{forloop}} 字典 # {% empty%}} 判斷是否為空 {% endfor%} if if語句支持 andor、==、>、<、!=、<=、>=、innot inisis not判斷。 {%if 條件%} {% endif%} {% with aa=dic.name%} 起別名 {{aa}} {%endwith%} 自定義過濾器 1 先去setting裏面把app名字配置上 2 再app目錄下創建一個templatetags模塊 3 寫py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 寫函數 addstr(用register.filter()裝飾) 7 模板: 8 {% load my_test %} 9 {{lqz|addstr:isbig }} #最多只能傳兩個參數 自定義標簽: settings app01-templatetags-my_test.py 1 先去setting裏面把app名字配置上 (除非新加的一般都是弄好的) 2 再app目錄下創建一個templatetags模塊 3 寫py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 寫函數 [email protected]_tag(name=yy)裝飾) @register.simple_tag(name=yy) def my_sum(x,y,z,i): return x+y+z+i 7 模板: 8 {% load my_test %} 9 {% yy 12 34 56 78 %} #以空格做分割,傳參數 @register.simple_tag(name=yy) @register.simple_tag(is_safe=False) 默認是true,防止xss攻擊,顯示字符串。false瀏覽器直接解釋標簽 自定義的過濾器,可以放在if判斷裏, 自定義的標簽,不能放在if判斷裏條件裏 靜態文件寫活: css路徑修改的話html引用不必改變 index.html: {% load static %} <link rel="stylesheet" href="{% static ‘mycss.css‘ %}"> 寫死的 <link rel="stylesheet" href="/static/mycss.css"> 練習: 自定義一個標簽(輸入一個值,計算出階乘,顯示再頁面) 自定義一個過濾器 (輸入兩個參數,做累加,支持數字,字符串(如果一個數字,一個字符串,強行相加))
技術分享圖片
from django import template

register=template.Library()

@register.filter
def myadd(value,arg):
    if type(value) == type(arg) == int or type(value) == type(arg) == str:
        return value+arg
    elif type(value) == int and type(arg) == str:
        return str(value) + arg
    elif type(value) == str and type(arg) == int:
        return value + str(arg)
    else:
        return 參數只能是數字或字符串

@register.simple_tag
def myfactorial(n):
    if type(n) != int:
        # raise ValueError
        return ValueError
    if n == 0 or n == 1:
        return 1
    else:
        return (n*myfactorial(n-1))
自定義標簽 技術分享圖片
from django.shortcuts import render

from django.utils.safestring import mark_safe
# Create your views here.

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

    @classmethod
    def class_test(cls):
        print(class method)
        return class method
    def test(self):
        print(method)
        return self.name

    # def __str__(self):
    #     return self.name


def index(request):

    n1 = 1
    n2 = 2
    n3 = 5
    s1=a
    s2=b

    ss=lqz is big
    i=20
    ll=[lqz,18,[1,2,[2,3]]]
    ll4=[[1,2,3],[2,3,4],[1,2,9]]
    dic={name:lqz,age:18,t:[1,2,[2,3]]}
    b=True
    lqz=Person(lqz)
    egon=Person(egon)
    xiaohou=Person(xiaohou)
    monkey=Person(monkey)
    ll2=[lqz,egon,xiaohou,monkey]
    dic2={lqz:lqz,egon:egon}
    # print(lqz.class_test())
    # print(dic[‘name‘].upper)
    ll3=[]
    ss2=‘‘
    ss3=<a href="https://www.baidu.com">點我</a>
    # ss3=mark_safe(ss3)
    import datetime
    now=datetime.datetime.now()
    file=1024*1024*1024


    return render(request,index.html,locals())
    # return render(request,‘index.html‘,{‘ss‘:ss,})  建議使用這種
視圖函數 技術分享圖片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    {% load static %}
    <link rel="stylesheet" href="{% static ‘mycss.css‘ %}">
{#    <link rel="stylesheet" href="/staticaa/mycss.css">#}
</head>
<body>
<div>靜態文件寫活</div>

<hr>

{% load my_tags %}
{#{{ ‘12‘|add }}#}
<p>{{ n1|myadd:n2 }}</p>
<p>{{ s1|myadd:s2 }}</p>
<p>{{ s1|myadd:n2 }}</p>
<p>{{ ‘@#@‘|myadd:33 }}</p>
{% myfactorial ‘a‘ %}


自定義的過濾器,可以放在if判斷裏,
自定義的標簽,不能放在if判斷裏條件裏
<hr>

<h3>變量</h3>
<p>字符串:{{ ss }}</p>
<p>數字:{{ i }}</p>
<p>列表:{{ ll }}</p>
<h3>句點符,做深度查詢</h3>
<p>列表第2個值:{{ ll.2.2.0}}</p>
<p>布爾類型:{{ b}}</p>
<p>字典:{{ dic }}</p>
<p>字典取值:{{ dic.age }}</p>
<p>字典取值:{{ dic.t.2.1 }}</p>
<p>對象:{{ lqz }}</p>
<p>對象取值:{{ lqz.name }}</p>
<h2>對象方法,不要加括號</h2>
<p>對象方法:{{ lqz.test }}</p>
<p>類方法:{{ lqz.class_test }}</p>
<h3>註釋:前端看不到,django給處理了</h3>
{#<p>類方法:{{ Person}}</p>#}

<p>列表對象{{ ll2 }}</p>
<p>列表對象取值{{ ll2.1 }}</p>
<p>列表對象取值,在取值{{ ll2.1.name }}</p>

<p>對象字典{{ dic2 }}</p>
<p>對象字典取值{{ dic2.egon.name }}</p>
<p>空列表的情況就是一個空列表{{ ll3 }}</p>
<p>空字符串的情況    直接替換成空{{ ss2 }}</p>

<h3>xss 跨站腳本攻擊
    django為了解決這種攻擊行為所以對標簽進行了處理 特殊符號替換 瀏覽器不能直接解釋標簽只能原樣輸出
    ,如果想直接讓瀏覽器解釋這個標簽 需要用 mark_safe()函數 在views中 告訴django不要處理</h3>
<p>a標簽 {{ ss3 }}</p>
<h4>字典:{{ ss.upper }}</h4>
<h4>字典:{{ dic.name.upper }}</h4>
&lt

{#<script>alert(dsb)</script>#}
{# xss:比如提交評論 存到數據庫 響應到html 瀏覽器解釋 就會彈窗 這就是xss攻擊  所以一定要處理 #}

<h2>過濾器</h2>
冒號後不能加空格 now是第一個參數,冒號後面是第二個參數
<p>date過濾器 {{ now|date:‘Y-m-d:H:i:s‘ }}</p>
<p>date過濾器 {{ now|date }}</p>
<hr>
如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如:
<p>default過濾器  {{ ss2|default:‘字符串沒有值‘ }}</p>
<p>default過濾器  {{ ll3|default:‘列表沒有值‘ }}</p>
<hr>
返回值的長度。它對字符串和列表都起作用
<p>length過濾器  {{ ll2|length }}</p>
<hr>
將值格式化為一個 “人類可讀的” 文件尺寸 單位是B(例如 ‘13 KB‘, ‘4.1 MB‘, ‘102 bytes‘, 等等)。例如:
<p>filesizeformat過濾器  {{ file|filesizeformat }}</p>
<p>filesizeformat過濾器  {{ 1024|filesizeformat }}</p>
<hr>
切片操作
<p>slice過濾器  {{ ‘lqzisbig‘|slice:‘1:4‘ }}</p>
<hr>
如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾
帶空格的字符串不算點的數量
不帶空格的字符串算點的數量
<p>truncatechars過濾器  {{ ‘lqzisbigdddddddeee‘|truncatechars:9 }}</p>
<p>truncatewords過濾器:  {{ ‘lqz is big and egon is small‘|truncatewords:3 }}</p>
<hr>

<p>safe過濾器:  {{ ss3|safe }}</p>
{#可以在視圖函數裏處理 ss3=mark_safe(ss3)#}
<p>{{ ss3 }}</p>
<hr>
倆參數只能傳字符串和數字 相加,具體詳見源碼
<p>add過濾器:  {{ 12|add:"3" }}</p>
<p>add過濾器:  {{ ‘eee‘|add:"3rrr" }}</p>

<hr>
<h1>模板語法之標簽</h1>

{% for foo in ll %}
    <p>{{ forloop }}</p>
    <p>{{ forloop.counter }}</p>
    <p>{{ forloop.counter0 }}</p>
    <p>{{ forloop.revcounter }}</p>
    <p>{{ forloop.revcounter0 }}</p>
    <p>{{ forloop.first }}</p>
    <p>{{ forloop.last }}</p>
    {% if forloop.first %}
        lqz is big
        {% elif forloop.last %}
        倆人都小
        {% else %}
        egon is small

    {% endif %}

    <p>{{ foo }}</p>

{% endfor %}
<hr>
{% for foo in ll %}
    <p>{{ foo }}</p>
    {% empty %}
     沒有值
{% endfor %}
<hr>
{% for foo in ll3 %}
    <p>{{ foo }}</p>

    {% empty %}
    一定要放在for循環中
     沒有值
{% endfor %}
<hr>

{% for foo in ll4 %}
    {% for i in foo %}
        <p>{{ forloop }}</p>
       <p>{{ forloop.parentloop }}</p>


    {% endfor %}

{% endfor %}
<hr>

if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。

{% with ttttt=dic.name %}
    相當於重新賦值
    <p>{{ dic.name }}</p>
    <p>{{ ttttt }}</p>
    <p>{{ ttttt }}</p>
    <p>{{ ttttt }}</p>


{% endwith %}

<hr>

<hr>
</body>
</html>
模板層

模板層