1. 程式人生 > >Django的模板系統

Django的模板系統

ont 第一個元素 base 字符串 所有 作用 模塊 模板變量 字母

一、模板的組成

html代碼和邏輯控制代碼

二、邏輯控制代碼的形式


1、變量(使用雙大括號引用變量)

a、template和context

語法 : {{ var_name }}

模板系統不僅可以傳字符串,它可以傳遞任意對象,對於向列表、字典、元組等對象,我們可以用句點來處理,叫做深度變量的查找

eg

對應views.py

def index(request):
    l = [1, 2, 3]
    return render(request, index.html, locals())

對應index.html

<body>
<h1>傳遞過來的列表的第一個元素是 {{ l.0 }}</
h1> </body>

瀏覽器返回

傳遞過來的列表的第一個元素是 1

b、變量的過濾器filter

語法格式 : {{ 對象|filter:參數}}

過濾器中有add、addslashes、capfirst、cut、date、default、default_if_none等

add:給變量加上相應的值

addslashes:給變量中的引號前加斜線

capfirst:首字母大寫

cut:去除指定字符

date:格式化時間

。。。

如果傳入的變量是一段標簽,並想要實現其功能,則應給使用safe函數

eg:

不用safe函數

<body>
<h1>傳遞過來的列表的第一個元素是 {{ l.0 }}</
h1> 這是一個{{ s }} </body>

瀏覽器輸出

這是一個<a href=‘#‘>跳轉鏈接</a> 

使用safe函數

<body>
<h1>傳遞過來的列表的第一個元素是 {{ l.0 }}</h1>
這是一個{{ s|safe }}
</body>

瀏覽器輸出

這是一個跳轉鏈接

autoescape也可以實現同樣的功能

eg

<body>
<h1>傳遞過來的列表的第一個元素是 {{ l.0 }}</h1>
這是一個{{ s|safe }}<br>
{% autoescape off %} 這是一個{{ s }} {% endautoescape %} </body>

2、標簽(tag)的使用(使用大括號和百分比的組合來表示使用tag)

語法:{% tag %}

a、{% if %}的使用,做判斷,有if就要有{% endif %}

eg:

{% if l.0 > 3 %}
    <h2>
    {{ l.0 }}
    {% else %}
        <h2>
    {{ l.2 }}
{% endif %}
</h2> 

b、{% for %}的使用,做遍歷,同樣有for就要有{% endfor %}

eg:

{% for num in l %}
    <p>{{ num }}</p>
{% endfor %} 

for循環中還內置了forloop模板變量,forloop.counter表示循環的次數,它從1開始計數,第一次循環設為1,forloop.counter0,從0開始計數,forloop.revcounter反轉計數,forloop.first第一次循環時其值為True

eg:

{% for num in l %}
    <p>{{ forloop.counter0 }}:{{ num }}</p>
    <p>{{ forloop.counter }}:{{ num }}</p>
{% endfor %}

c、{%csrf_token%}:csrf_token標簽

當用post的方法提交表單時,django會報一個錯誤,這是django一個保護機制,用來防止跨站攻擊

eg:

<form action="/blog/register/" method="post">
    姓名<input type="text" name="username"><br>
    密碼<input type="text" name="psw"><br>
    <input type="submit">
</form>

報錯信息

Forbidden (403)

CSRF verification failed. Request aborted.

You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.

If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for ‘same-origin‘ requests.

添加後順利提交

<form action="/blog/register/" method="post">
    姓名<input type="text" name="username"><br>
    密碼<input type="text" name="psw"><br>
    <input type="submit">
    {% csrf_token %}
</form>

d、{% url %} 引用路由配置的地址

eg:

<form action="{% url ‘reg‘ %}" method="post">
    姓名<input type="text" name="username"><br>
    密碼<input type="text" name="psw"><br>
    <input type="submit">
    {% csrf_token %}
</form>

req為路由配置中的別名

e、{% verbatim %}: 禁止render,有開始就有結束{% endverbatim %}

包含在其中的代碼將不被render渲染

f、{% load %}: 加載標簽庫

g、{% with %}:用更簡單的變量名替代復雜的變量名,需要{% endwith %}

eg:

{% with s=qwer %}
    {{ s }}
{% endwith %}

註意:s=qwer之間不得有空格,否則報錯


3、自定義filter和simple_tag

a、在app中創建templatetags模塊(必須的)

b、創建任意 .py 文件,如:mytag.py

eg:

自定義

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


register = template.Library()#變量名必須時register


@register.filter
def filter_mul(a, b):
    return a*b


@register.simple_tag()
def tag_mul(a, b):
    return a*b

如何使用

在html文件的第一行加載{% load mytag %}即可,這裏創建的文件為mytag.py

eg:

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

需要註意的是 filter可以用在if等語句後,simple_tag不可以


三、模板的繼承

1、如果在模板中使用 {% extends %} ,必須保證其為模板中的第一個模板標記。 否則,模板繼承將不起作用。

2、一般來說,基礎模板中的 {% block %} 標簽越多越好。 記住,子模板不必定義父模板中所有的代碼塊,因此你可以用合理的缺省值對一些代碼塊進行填充,然後只對子模板所需的代碼塊進行(重)定義。 俗話說,鉤子越多越好

3、如果發覺自己在多個模板之間拷貝代碼,你應該考慮將該代碼段放置到父模板的某個 {% block %} 中。如果你需要訪問父模板中的塊的內容,使用 {{ block.super }}這個標簽吧,這一個魔法變量將會表現出父模板中的內容。 如果只想在上級代碼塊基礎上添加內容,而不是全部重載,該變量就顯得非常有用了

4、不允許在同一個模板中定義多個同名的 {% block %} 。 存在這樣的限制是因為block 標簽的工作方式是雙向的。也就是說,block 標簽不僅挖了一個要填的坑,也定義了在父模板中這個坑所填充的內容。如果模板中出現了兩個相同名稱的 {% block %} 標簽,父模板將無從得知要使用哪個塊的內容

eg:

a、創建base.html模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% block base1 %}
<p>我是模板</p>
{% endblock %}
<form action="{% url ‘reg‘ %}" method="post">
    姓名<input type="text" name="username"><br>
    密碼<input type="text" name="psw"><br>
    <input type="submit">
    {% csrf_token %}
</form>
</body>
</html>

b、創建子模板register.html,並利用{{ block.super }}輸出父模板中代碼塊中的內容

{% extends ‘base.html‘ %} #繼承自base.html

{% block base1 %}
    <p>{{ s }}</p>  #s為後端傳入的變量
    {{ block.super }}
{% endblock %}

訪問register.html

技術分享圖片

Django的模板系統