【Django複習】--- 模板格式

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

下載:zqxt_tmpl2.zip(項目名:zqxt_tmpl2, 修改 app/views.py 和 app/templates/home.html 來測試後面的示例)

實例二,講解了基本的 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/

 

注意:如果是 Django 1.4 的話,需要在模板開頭加上 {% load url from future %} (如果有 extends 的話,加在 extends 下面)

示例下載:zqxt_views_for_url_in_template.tar.gz (如果下載後無法解壓,請改後綴名爲 .tar.gz )

 

還可以使用 as 語句將內容取別名(相當於定義一個變量),多次使用(但視圖名稱到網址轉換隻進行了一次)

1

2

3

{% url 'some-url-name' arg arg2 as the_url %}

 

<a href="{{ the_url }}">鏈接到:{{ the_url }}</a>

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

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 加入到 上下文渲染器(點擊查看詳細)

Django 1.8 及以後 修改 settings.py (Django 1.11 中新建的項目已經默認加上了)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

TEMPLATES = [

    {

        'BACKEND''django.template.backends.django.DjangoTemplates',

        'DIRS': [],

        'APP_DIRS'True,

        'OPTIONS': {

            'context_processors': [

                ...

                'django.template.context_processors.request',

                ...

            ],

        },

    },

]

Django 1.7 及以前 修改 settings.py:

如果沒有 TEMPLATE_CONTEXT_PROCESSORS 請自行添加下列默認值:

1

2

3

4

5

6

7

8

9

TEMPLATE_CONTEXT_PROCESSORS = (

    "django.contrib.auth.context_processors.auth",

    "django.core.context_processors.debug",

    "django.core.context_processors.i18n",

    "django.core.context_processors.media",

    "django.core.context_processors.static",

    "django.core.context_processors.tz",

    "django.contrib.messages.context_processors.messages",

)

然後再加上 django.core.context_processors.request

1

2

3

4

5

TEMPLATE_CONTEXT_PROCESSORS = (

    ...

    "django.core.context_processors.request",

    ...

)

然後在 模板中我們就可以用 request 了。一般情況下,推薦用 render 而不是用 render_to_response

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 來刪除當前的頁面內容。

 

完整的內容參考官方文檔:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章