4-django——模板

概述

clipboard.png

定義模板

變量

要遵照標識符規則

語法: {{ var }}css

在模板中使用點語法,按順序查詢:字典查詢;屬性或者方法查詢;數字索引查詢html

若是使用的變量不存在,則插入空字符串python

在模板中調用對象的方法,可是不能給函數傳參django

示例json

<body>
    <h1>sunck is a good man</h1>
    <h1>he is {{ age }} years old</h1>
    <h1>{{ stu.name }}--{{ stu.age }}--{{ stu.grade }}</h1>
    <h1>*{{ name }}*</h1>
    <h1>{{ stu.say }}</h1>
</body>

標籤

語法:{% tag %}

做用: 在輸出中建立文本;控制邏輯或循環;加載外部信息到模板中使用segmentfault

ifcookie

{% if 表達式 %}
語句
{% endif %}

{% if 表達式 %}
語句1
{% else %}
語句2
{% endif %}

{% if 表達式1 %}
語句1
{% elif 表達式2 %}
語句2
{% elif 表達式3 %}
語句3
……
{% else %}
語句e


<body>
    <h1>sunck is a handsome man!</h1>
    {% if age > 18 %}
    <h1>sunck is a nice man</h1>
    {% else %}
    <h1>sunck is a good man</h1>
    {% endif %}
</body>
{% endif %}

for函數

{% for 變量 in 集合 %}
語句
{% endfor %}

{% for 變量 in 集合 %}
語句1
{% empty %}
語句2

# 當沒有該集合或者集合爲空的時候執行empty標籤下的語句2
<ul>
    {% for stu in stus %}
        <li>{{ stu.name }}--{{ stu.age }}</li>
    {% empty %}
        <li>沒有學生</li>
    {% endfor %}
</ul>

{% endfor %}

commentpost

做用 : 註釋 單行註釋({#<h1>sunck is a handsome man!</h1>#}) 多行註釋
{% comment %}
註釋內容
{% endcomment%}
# 能夠註釋HTML代碼和邏輯控制代碼

ifequal/ifnotequal網站

做用: 判斷是否相等/不相等

# 若是值1等於值2,則執行語句
{% ifequal 值1 值2 %}
語句
{% endequal %}

# 若是值1不等於值2,則執行語句
{% ifnotequal 值1 值2 %}
語句
{% endequal %}

include

做用: 加載模板

格式: {% include '模板目錄' %}

示例: {% include 't1.html' %}

url

做用:用於反向解析

格式: {% url 'namespace:name' 參數1 參數2 …… %}

csrf_token

做用:用於跨站請求僞造保護

格式:{% csrf_token %}

block、extends

做用:用於繼承

autoescape

做用:用於HTML轉義

過濾器

做用: 在變量被顯示以前修改它的顯示

語法: {{ 變量|過濾器 }}

簡單過濾器: lower upper

<h1>{{ des }}</h1>
<h1>{{ des|lower }}</h1>
<h1>{{ des }}</h1>

過濾器可傳參,參數用引號引發來

join: <h1>{{ arr|join:'#' }}</h1>

若是一個變量沒有提供或者值爲False或者值爲空,則可使用默認值,不然使用變量的值

default: <h1>{{ name|default:'sunck' }}</h1>

根據給定格式對一個date變量格式化顯示

date : <h1>{{ value|date:'Y-m-d' }}</h1>

加減乘除

<h1>{{ age|add:2 }}</h1>
<h1>{{ age|add:-2 }}</h1>
{#  widthratio 參數1  參數2  參數3  #}
{#  參數1/參數2*參數3  #}
<h1>{% widthratio age 1 2  %}</h1>
<h1>{% widthratio age 2 1  %}</h1>

轉義: escape;safe

自定義過濾器

過濾器就是python的函數,能夠註冊函數後在模板中當過濾器調用

# 在應用目錄下建立名爲templatetags的包
# 在templatetags目錄下建立名爲filters.py的文件
# -*- coding:utf-8 -*-

#導入Library庫
from django.template import Library

#建立一個Library對象
register = Library()

#定義函數
#使用裝飾器註冊成過濾器
@register.filter
def even(value):
    return value % 2 == 0

@register.filter
def sub(value, othre):
    return value - othre
# 使用自定義過濾器
{% load filters %}

{{ 19|sub:9 }}
{% if 19|even %}
<h1>********************1</h1>
{% else %}
<h1>********************2</h1>
{% endif %}

反向解析

主路由:url(r'^', include("myApp.urls", namespace="myApp")),

子路由:url(r'^market2/$', views.market, name="market")

模板 : <a href="{% url 'myApp:market' %}">點我跳轉</a>

模板繼承

做用: 模板繼承能夠減小頁面內容的衝定義,實現頁面內容的重用

block標籤: 在父模板中預留區域,在子模板中填充

extends標籤: 實現繼承,寫在模板文件的第一行

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock title %}</title>

    {% block link %}{% endblock link %}
    {% block script %}{% endblock script %}
</head>
<body>
    <header>頭</header>
    <div>
        {% block main %}

        {% endblock main %}
    </div>
    <footer>尾</footer>
</body>
</html>
{% extends 'base.html' %}

{% block title %}child1{% endblock title %}

{% block main %}
<h1>child1</h1>
{% endblock main %}

HTML轉義

Django默認開啓了HTML轉義

def login(request):
    if request.method == "GET":
        # infoStr = "<h1>sunck is a good man</h1>"
        infoStr = "<script>alert('sunck good')</script>"
        return render(request, "login.html", {"infoStr":infoStr})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
</head>
<body>
{% autoescape off %}
    {{ infoStr }}
    {{ infoStr|safe }}
    {{ infoStr|escape }}
{% endautoescape %}
    <form action="/login/" method="post">
        帳號:<input type="text" name="username" value=""><hr/>
        密碼:<input type="password" name="password" value=""><hr/>
        <input type="submit" value="登錄">
    </form>
</body>
</html>

CSRF

跨站請求僞造保護: 某些惡意網站上包含連接、表單按鈕或者JavaScript,它們會利用登錄過的用戶信息試圖在咱們的網站上完成某些操做,這就是跨站攻擊

clipboard.png

防止CSRF

# 在settings.py中啓用"'django.middleware.csrf.CsrfViewMiddleware',"中間件,工程中默認開啓
# 開啓保護後不管是本身仍是別人都會被屏蔽
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
</head>
<body>
    <form action="http://127.0.0.1:8000/login/" method="post">
        {% csrf_token %}
        帳號:<input type="text" name="username" value=""><hr/>
        密碼:<input type="password" name="password" value=""><hr/>
        <input type="submit" value="登錄">
    </form>
</body>
</html>

{% csrf_token %}: 給表單頁面生成一個隱藏域;寫入一個名爲csrftoken的cookie;給隱藏域的value設置爲名爲csrftoken的cookie的值;

靜態文件

包含工程中的css、js、img、json等文件

在工程目下建立名爲static的目錄用以存儲靜態文件

配置靜態文件路徑

# settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS=[
    os.path.join(BASE_DIR, "static"),
]
{#{% load static from staticfiles %}#}
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主頁</title>

{#    <link rel="stylesheet" type="text/css" href="/static/css/index.css">#}
    <link rel="stylesheet" type="text/css" href="{% static 'css/index.css' %}">
</head>
<body>
    <h1>sunck is a good man</h1>
</body>
</html>

5-django——驗證碼,中間件

相關文章
相關標籤/搜索