1. 程式人生 > >django模版進階

django模版進階

https://code.ziqiangxuetang.com/django/django-template2.html

本節主要講 Django模板中的迴圈,條件判斷,常用的標籤,過濾器的使用

  1. 列表,字典,類的例項的使用

  2. 迴圈:迭代顯示列表,字典等中的內容

  3. 條件判斷:判斷是否顯示該內容,比如判斷是手機訪問,還是電腦訪問,給出不一樣的程式碼。

  4. 標籤:for,if 這樣的功能都是標籤。

  5. 過濾器:管道符號後面的功能,比如{{ var|length }},求變數長度的 length 就是一個過濾器。

如果需要將一個或多個變數共享給多個網頁或者所有網頁使用,比如在網頁上顯示來訪者的IP,這個可以使用 Django 上下文渲染器 來做。

例項一,顯示一個基本的字串在網頁上

views.py

1

2

3

4

5

6

7

# -*- coding: utf-8 -*-

from django.shortcuts import render

 

 

def home(request):

    string = u"我在自強學堂學習Django,用它來建網站"

    return render(request, 

'home.html', {'string': string})

在檢視中我們傳遞了一個字串名稱是 string 到模板 home.html,在模板中這樣使用它:

home.html

1

{{ string }}

QQ20150511-5@2x.png

例項二,基本的 for 迴圈 和 List內容的顯示

views.py

1

2

3

def home(request):

    TutorialList 

= ["HTML""CSS""jQuery""Python""Django"]

    return render(request, 'home.html', {'TutorialList': TutorialList})

在檢視中我們傳遞了一個List到模板 home.html,在模板中這樣使用它:

home.html

1

2

3

4

教程列表:

{% for i in TutorialList %}

{{ i }}

{% endfor %}

for 迴圈要有一個結束標記,上面的程式碼假如我們對應的是首頁的網址(自己修改urls.py),顯示在網頁上就是:

QQ20150511-4@2x.png

簡單總結一下:一般的變數之類的用 {{ }}(變數),功能類的,比如迴圈,條件判斷是用 {%  %}(標籤)

例項三,顯示字典中內容:

views.py

1

2

3

def home(request):

    info_dict = {'site': u'自強學堂''content': u'各種IT技術教程'}

    return render(request, 'home.html', {'info_dict': info_dict})

home.html

1

站點:{{ info_dict.site }} 內容:{{ info_dict.content }}

在模板中取字典的鍵是用點info_dict.site,而不是Python中的 info_dict['site'],效果如下:

QQ20150511-6@2x.png

還可以這樣遍歷字典:

1

2

3

{% for key, value in info_dict.items %}

    {{ key }}: {{ value }}

{% endfor %}

其實就是遍歷這樣一個 List:  [('site', u'自強學堂'), ('content', u'各種IT技術教程')]

QQ20150511-7@2x.png

例項四,在模板進行 條件判斷和 for 迴圈的詳細操作:

views.py

1

2

3

def home(request):

    List = map(strrange(100))# 一個長度為100的 List

    return render(request, 'home.html', {'List'List})

假如我們想用逗號將這些元素連線起來:

home.html

1

2

3

{% for item in List %}

    {{ item }}, 

{% endfor %}

效果如下:

QQ20150512-1@2x.png

我們會發現最後一個元素後面也有一個逗號,這樣肯定不爽,如果判斷是不是遍歷到了最後一個元素了呢?

用變數 forloop.last 這個變數,如果是最後一項其為真,否則為假,更改如下:

1

2

3

{% for item in List %}

    {{ item }}{% if not forloop.last %},{% endif %

{% endfor %}

QQ20150512-2@2x.png

在for迴圈中還有很多有用的東西,如下:

變數 描述
forloop.counter 索引從 1 開始算
forloop.counter0 索引從 0 開始算
forloop.revcounter 索引從最大長度到 1
forloop.revcounter0 索引從最大長度到 0
forloop.first 當遍歷的元素為第一項時為真
forloop.last 當遍歷的元素為最後一項時為真
forloop.parentloop

用在巢狀的 for 迴圈中,

獲取上一層 for 迴圈的 forloop

當列表中可能為空值時用 for  empty

1

2

3

4

5

6

7

<ul>

{% for athlete in athlete_list %}

    <li>{{ athlete.name }}</li>

{% empty %}

    <li>抱歉,列表為空</li>

{% endfor %}

</ul>

例項五,模板上得到檢視對應的網址:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# views.py

def add(request, a, b):

    = int(a) + int(b)

    return HttpResponse(str(c))

 

 

# urls.py

urlpatterns = patterns('',

    url(r'^add/(\d+)/(\d+)/$''app.views.add', name='add'),

)

 

 

# template html

{% url 'add' 4 5 %}

 

這樣網址上就會顯示出:/add/4/5/ 這個網址,假如我們以後修改 urls.py 中的 

1

r'^add/(\d+)/(\d+)/$'

這一部分,改成另的,比如:

1

r'^jiafa/(\d+)/(\d+)/$'

這樣,我們不需要再次修改模板,當再次訪問的時候,網址會自動變成 /jiafa/4/5/

例項六,模板中的邏輯操作:

6.1、   ==, !=, >=, <=, >, < 這些比較都可以在模板中使用,比如:

1

2

3

4

5

6

7

8

9

10

11

{% if var >= 90 %}

成績優秀,自強學堂你沒少去吧!學得不錯

{% elif var >= 80 %}

成績良好

{% elif var >= 70 %}

成績一般

{% elif var >= 60 %}

需要努力

{% else %}

不及格啊,大哥!多去自強學堂學習啊!

{% endif %}

注意:比較符號前後必須有至少一個空格

and, or, not, in, not in 也可以在模板中使用

假如我們判斷 num 是不是在 0 到 100 之間:

1

2

3

4

5

{% if num <= 100 and num >= 0 %}

num在0到100之間

{% else %}

數值不在範圍之內!

{% endif %}

假如我們判斷 'ziqiangxuetang' 在不在一個列表變數 List 中:

1

2

3

{% if 'ziqiangxuetang' in List %}

自強學堂在名單中

{% endif %}

例項七,模板中 獲取當前網址,當前使用者等:

如果不是在 views.py 中用的 render 函式,是 render_to_response 的話,需要將 request 加入到 上下文渲染器(點選檢視詳細)

 

7.1 獲取當前使用者:

 

1

{{ request.user }}

如果登陸就顯示內容,不登陸就不顯示內容:

1

2

3

4

5

{% if request.user.is_authenticated %}

    {{ request.user.username }},您好!

{% else %}

    請登陸,這裡放登陸連結

{% endif %}

7.2.1 獲取當前網址:

1

{{ request.path }}

7.2.2 獲取當前 GET 引數:

1

{{ request.GET.urlencode }}

7.2.3 合併到一起用的一個例子:

1

<a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">當前網址加引數 delete</a>

比如我們可以判斷 delete 引數是不是 1 來刪除當前的頁面內容。