自定義 URL 對(duì)應(yīng)的視圖
在 views.py 中增加 URL 的過(guò)濾和響應(yīng)事件
在 views.py 中增加過(guò)濾
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello world, You're at the polls index.")
新建 urls.py
此 urls.py 中主要是為了設(shè)置 URL 的攔截
攔截到url 后费奸,通過(guò)攔截到的URL和 request 做一些不同的響應(yīng)(response)
^$ 代表所有的路徑都要進(jìn)行過(guò)濾
urlpatterns = [
url(r'^$', views.index, name='index')
]
這樣配置后將 views 中的 index 方法注冊(cè)為了 URL的過(guò)濾和處理的一個(gè)方法,所有的網(wǎng)絡(luò)請(qǐng)求,都會(huì)進(jìn)入此方法進(jìn)行匹配
【說(shuō)明】r'^' 這個(gè)是正則表達(dá)式
注冊(cè) urls.py 文件
在前兩步只是定義了方法和聲明這個(gè)方法為 url 的過(guò)濾方法之一亿胸,但是我們的定義和聲明都在 views.py 比庄、 urls.py 文件中放置元践,程序并不會(huì)執(zhí)行到這個(gè)地方讯蒲,我們需要告訴程序
在 工程的 urls.py 文件中配置
此處配置了URL的過(guò)濾
第一行是:將匹配到 polls/ 路徑下的 的所有請(qǐng)求使用 polls.urls.py 文件中的過(guò)濾方法進(jìn)行過(guò)濾
第二行是默認(rèn)的執(zhí)行過(guò)濾
urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', include(admin.site.urls))
]
正則
針對(duì) URL /polls/test/ 說(shuō)明匹配
- jango發(fā)現(xiàn)匹配到了正則表達(dá)式'^polls/'
- 然后沿盅,Django將去掉匹配到的文本("polls/")并將剩下的文本 —— "test/" —— 發(fā)送給‘polls.urls’ URLconf 做進(jìn)一步處理
url() 方法的使用
url()函數(shù)具有四個(gè)參數(shù):兩個(gè)必需的regex和 view把篓,以及兩個(gè)可選的kwargs和name。 到這里腰涧,就可以研究下這些參數(shù)的含義了
r'^(?P<question_id>[0-9]+)/$'
很明顯這個(gè)是正則 (?P<question_id>) 定義了一個(gè)名字韧掩,它將用于標(biāo)識(shí)匹配的模式
[0-9]是標(biāo)識(shí)至少存在一個(gè)數(shù)字
模板
- 將模板放置在 templates 的 polls 目錄下面。因?yàn)?通過(guò) polls 相當(dāng)于是創(chuàng)建了命名空間
- 在 views.py 中窖铡,不同的 path 返回不同的模板
- views.py 文件就是一個(gè)中間者 mvc 中的 c疗锐。模板就是 v。傳給模板的值就是 m
模板的使用
def index(request):
last_question_list = Question.objects.order_by('-pub_date')[:5]
# 因?yàn)槲覀兾覀円呀?jīng)設(shè)置過(guò)查找 templates 并且默認(rèn)的就是查找 templates 费彼,故默認(rèn)就是在 templates 文件下
# 取出模板
indexTemplate = loader.get_template('polls/index.html')
# 創(chuàng)建一個(gè)渲染上下文
context = RequestContext(request, {
'latest_question_list': last_question_list,
})
# 將上下文應(yīng)用到模板
out_put = indexTemplate.render({
'latest_question_list': last_question_list,
})
return HttpResponse(out_put)
404
# 此處是獲取對(duì)象的屬性
# get_object_or_404()
# 函數(shù)將一個(gè)Django模型作為它的第一個(gè)參數(shù)滑臊,任意數(shù)量的關(guān)鍵字參數(shù)作為它的第二個(gè)參數(shù),它會(huì)將這些關(guān)鍵字參數(shù)傳遞給模型管理器中的get()
# 函數(shù)箍铲。如果對(duì)象不存在雇卷,它就引發(fā)一個(gè)
# Http404異常。
# 還有一個(gè)get_list_or_404()
# 函數(shù)颠猴,它的工作方式類(lèi)似get_object_or_404() —— 差別在于它使用filter()
# 而不是get()关划。如果列表為空則引發(fā)Http404。
question = get_object_or_404(Question,pk=question_id)
URL 的三種寫(xiě)法
<a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a>
<a href="{% url 'detail' question.id %}">{{ question.question_text }}</a>
<a href="/polls/{{ question.id }}">{{ question.question_text }}</a>