上篇文章講到視圖部分知識(shí),本文將對(duì)視圖的用法進(jìn)行深入學(xué)習(xí)。
自定義視圖
隨著我們的Web站點(diǎn)頁(yè)面越來(lái)越多,頁(yè)面鏈接會(huì)越來(lái)越雜亂無(wú)章。因此有必要在項(xiàng)目一開始就對(duì)其進(jìn)行管理。
1) 實(shí)現(xiàn)/articles/123
的效果
urls.py文件可以這么寫:
url(r'^articles/(\d+)/$', views.articles, name='articles')
views.py實(shí)現(xiàn)了articles方法
def articles(request, id):
return HttpResponse("articles'id = "+str(id))
這其中url()函數(shù)具有四個(gè)參數(shù), regex和view是必填選項(xiàng),kwargs和name是非必填選項(xiàng)
regex
: 正則表達(dá)式的縮寫。Djaogo從第一個(gè)正則表達(dá)式開始,依次對(duì)請(qǐng)求url進(jìn)行匹配,直到找到匹配到那個(gè)為止。
view
: 目標(biāo)視圖,即views.py文件中的函數(shù)。
kwargs
: 任何關(guān)鍵字參數(shù)都可以以字典形式傳遞給目標(biāo)視圖。
name
: 命名你的URL, 相當(dāng)于給url取個(gè)別名。 這樣就可以在Django的其它地方尤其是模板中,通過(guò)名稱來(lái)明確地引用這個(gè)URL。 這個(gè)強(qiáng)大的特性可以使你僅僅修改一個(gè)文件就可以改變?nèi)值腢RL模式。
模版
學(xué)到這里,你會(huì)許會(huì)有個(gè)疑問(wèn)。web頁(yè)面應(yīng)該含有html代碼的,為什么我沒(méi)有看到html頁(yè)面呢?我的web頁(yè)面不能單單只是一句話,應(yīng)該有導(dǎo)航欄,內(nèi)容欄,底部欄吧。要滿足這需求,則需要用到渲染模板的方法來(lái)顯示內(nèi)容。
為了方便理解,引用以上篇文章的例子
test目錄下新建一個(gè) templates 文件夾, 里面新建一個(gè)base.html 和 home.html
新建base.html目的是為了代碼復(fù)用。把一些通用的部分,例如導(dǎo)航,底部,訪問(wèn)統(tǒng)計(jì)代碼等抽取出來(lái)封裝成一個(gè)頁(yè)面:nav.html、 bottom.html、 tongji.html。
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默認(rèn)標(biāo)題{% endblock %}</title>
</head>
<body>
{% include 'nav.html' %}
{% block content %}
<div>這里是默認(rèn)內(nèi)容,所有繼承自這個(gè)模板的,如果不覆蓋就顯示這里的默認(rèn)內(nèi)容。</div>
{% endblock %}
{% include 'bottom.html' %}
{% include 'tongji.html' %}
</body>
</html>
我們的首頁(yè) home.html,繼承或者說(shuō)擴(kuò)展(extends)原來(lái)的 base.html,可以簡(jiǎn)單這樣寫,重寫部分代碼(默認(rèn)值的那一部分不用改)。代碼如下:
{% extends 'base.html' %}
{% block title %}歡迎光臨首頁(yè){% endblock %}
{% block content %}
{% include 'ad.html' %}
這里是首頁(yè),歡迎光臨
{% endblock %}
url.py文件增加相對(duì)應(yīng)的url函數(shù)就行,而views.py文件就需要改動(dòng)了。
使用render()函數(shù)載入一個(gè)模板進(jìn)行渲染。
該函數(shù)有三個(gè)參數(shù),將請(qǐng)求對(duì)象作為它的第一個(gè)參數(shù),模板的名字作為它的第二個(gè)參數(shù),一個(gè)字典作為它可選的第三個(gè)參數(shù)。 它返回一個(gè)HttpResponse對(duì)象,含有用給定的context 渲染后的模板。
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
模板進(jìn)階
view.py屬于View層,是用于顯示界面。但是在實(shí)際應(yīng)用中,往往view的數(shù)據(jù)不是寫死的,是由模型層傳輸過(guò)來(lái)的。怎么將model層傳輸過(guò)來(lái)數(shù)據(jù)顯示在視圖上呢?Django模板算是利器,它具有循環(huán)、條件判斷、常用的標(biāo)簽、過(guò)濾器等功能,這能消除我們的剛才的煩惱。
首先,我們應(yīng)該知道兩個(gè)知識(shí)點(diǎn)。分別是:
1)標(biāo)簽的寫法: 使用{% 標(biāo)簽 %}
, 例如
{% for item in List %}
{{ item }}{% if not forloop.last %},{% endif %}
{% endfor %}
2)變量的寫法: 使用{{ 變量 }}
, 例如
{{ request.path }} // 獲取當(dāng)前網(wǎng)址
變量 | 描述 |
---|---|
forloop.counter | 索引從 1 開始算 |
forloop.counter0 | 索引從 0 開始算 |
forloop.revcounter | 索引從最大長(zhǎng)度到 1 |
forloop.revcounter0 | 索引從最大長(zhǎng)度到 0 |
forloop.first | 當(dāng)遍歷的元素為第一項(xiàng)時(shí)為真 |
forloop.last | 當(dāng)遍歷的元素為最后一項(xiàng)時(shí)為真 |
forloop.parentloop | 用在嵌套的 for 循環(huán)中,獲取上一層 for 循環(huán)的 forloop |
補(bǔ)充知識(shí)
1)在for循環(huán)中還有很多有用的東西,如下:
變量 | 描述 |
---|---|
forloop.counter | 索引從 1 開始算 |
forloop.counter0 | 索引從 0 開始算 |
forloop.revcounter | 索引從最大長(zhǎng)度到 1 |
forloop.revcounter0 | 索引從最大長(zhǎng)度到 0 |
forloop.first | 當(dāng)遍歷的元素為第一項(xiàng)時(shí)為真 |
forloop.last | 當(dāng)遍歷的元素為最后一項(xiàng)時(shí)為真 |
forloop.parentloop | 用在嵌套的 for 循環(huán)中,獲取上一層 for 循環(huán)的 forloop |
2)如果想表示空值,代碼如下
{% empty %} // 表示為空
系列文章:
Django學(xué)習(xí)之旅(一)
Django學(xué)習(xí)之旅(二)
Django學(xué)習(xí)之旅(四)
Django學(xué)習(xí)之旅(五)
Django學(xué)習(xí)之旅(六)
推薦閱讀:
爬蟲系列的總結(jié)