1. 程式人生 > >Django學習(七)(模板進階)

Django學習(七)(模板進階)

主要學習Django模板中的迴圈,條件判斷,常用的標籤,過濾器的使用.
1.列表,字典,類的例項的使用.
2.迴圈:迭代顯示列表,字典中的內容
3.條件判斷:判斷是否顯示該內容,比如判斷是手機訪問,還是電腦訪問,給出不一樣的程式碼.
4.標籤:for ,if這樣的功能都是標籤.
5.過濾器:管道符號後面的功能,比如{{var|length}},求變數長度的length就是一個過濾器.
如果需要將一個或多個變數共享給多個網頁或者所有網頁使用,比如在網頁上顯示來訪者的IP,這個可以使用Django上下文渲染器來做.

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

#-*- coding:utf-8 -*-
from django.shortcuts import render def home(request): string = u"我在自強學堂學習Django,用它來建網站" return render(request,)

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

{{string}}

這裡寫圖片描述

例項二 講解基本的for迴圈和List內容的顯示
view.py

def home(request):
    TutorialList =["HTML","CSS","jQuery","Python"
,"Django"] return render(request,'home.html',{'TutorialList':TutorialList})

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

{% for i in TutorialList %}{{ i }}{% endfor %}

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

這裡寫圖片描述

簡單的總結一下: 一般變數使用{{ }}(變數),功能類的,比如迴圈,條件判斷是用{% %}(標籤)
例項三 顯示字典中內容
view.py

def home(request):
    info_dict = {'site':u'自強學堂',
                 'content':u'各種IT技術教程'}
    return render(request,'home.html',{'info_dict':info_dict})

home.html

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

效果如圖

這裡寫圖片描述

在模板中取字典的鍵是用info_dict.site,而不是Python中的info_dict[‘site’]

還可以這樣遍歷字典

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

其實就是這樣遍歷一個List:[(‘site’,u’自強學堂’),(‘content’,u’各種IT技術教程’)]
例項四 在模板進行 條件判斷和for迴圈的詳細操作:
view.py

def home(request):
    List = map(str,rang(100)) #長度為100的List
    return render(request,'home.html',{'List':List})

用逗號將這些元素連線起來:
home.html

{% for item in List %}{{ item }},
{% endfor %}

這裡寫圖片描述

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

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

{% for item in List %}{{item}}{% if not forloop.last %},{% endif %} #不是最後一項就加逗號,是就不加
{% endfor %}

這裡寫圖片描述
for迴圈中還有很多有用的東西
變數 描述
forloop.counter 索引從 1 開始算
forloop.counter0 索引從 0 開始算
forloop.revcounter 索引從最大長度到 1
forloop.revcounter0 索引從最大長度到 0
forloop.first 當遍歷的元素為第一項時為真
forloop.last 當遍歷的元素為最後一項時為真
forloop.parentloop
用在巢狀的 for 迴圈中,

獲取上一層 for 迴圈的 forloop

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

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

#view.py 
def add(request,a,b):
    c = 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中的

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

這一部分,改成別的 如:

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

這樣我們不需要再次修改模板,當再次訪問的時候,網址會自動變成/jiafa/4/5/
還可以用as語句將內容取別名(相當於定義一個變數),多次使用(但檢視名稱到網址轉換隻進行了一次)

{% url'some-url-name' arg arg2 as the_url %}
<a href = "{{ the_url }}">連結到:{{ the_url }}</a>

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

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

{% if var >= 90 %}
成績優秀,自強學堂你沒少去吧!學的不錯.
{% elif var >= 80 %}
成績良好!
{% elif var >= 70 %}
成績一般.
{% elif var >= 60 %}
需要努力啊!
{% else %}
不及格啊,多去自強學堂學習啊!
{% endif %}

注意:比較符號前後必須至少有一個空格.
and,or,not,in,not in也可以用在模板中.
假如我們判斷num是不是在0到100之間:

{% if num <= 100 and num >=0 %}
num0100之間
{% else %}
數值不在範圍之內!
{% endif %}

假如我們判斷’ziqiangxuetang’在不在一個列表變數list中

{% if 'ziqiangxuetang' in List %}
自強學堂在名單
{% endif %}

例項七 模板中 獲取當前網址,當前使用者
如果不是在view.py中用的render函式,是render to response,需要將 requset 加入到 上下文渲染器
Django1.8及以後修改setting.py(Django.1.11中新建的專案已經預設加上了)

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 請自行新增下列預設值:

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

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "django.core.context_processors.request",
    ...
)

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

獲取當前使用者:
{{ request.user }}
如果登陸就顯示內容,不登陸就不顯示內容:

{% if request.user.is_authenticated %}{{ request.user.username }},您好!
{% else %}
請登陸,這裡放登陸連結.
{% endif %}

獲取當前網址:

{{ request.path }}

獲取當前GET引數:

{{ request.GET.urlencode }}

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

<a href="{{ request.path}}?{{ request.GET.urlencode }}&delete=1"></a>

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