Django 應(yīng)用,寫一個(gè)真正有用的視圖

每個(gè)視圖必須要做的只有兩件事:返回一個(gè)包含被請(qǐng)求頁面內(nèi)容的 HttpResponse 對(duì)象,或者拋出一個(gè)異常,比如 Http404

當(dāng)然你也可以從數(shù)據(jù)庫里讀取記錄漓帅,可以使用一個(gè)模板引擎(比如 Django 自帶的,或者其他第三方的)痴怨,可以生成一個(gè) PDF 文件撤防,或者輸出一個(gè) XML

寫一個(gè)真正有用的視圖

我們?cè)?index() 函數(shù)里插入了一些新內(nèi)容忆肾,在上一節(jié)中講過如果創(chuàng)建視圖挪丢,讓它能展示數(shù)據(jù)

from django.http import HttpResponse

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    output = ', '.join([q.question_text for q in latest_question_list])
    return HttpResponse(output)

這里有個(gè)問題:頁面的設(shè)計(jì)寫死在視圖函數(shù)的代碼里的登刺。如果你想改變頁面的樣子,你需要編輯 Python 代碼爱葵。所以讓我們使用 Django 的模板系統(tǒng)

首先施戴,在你的 polls 目錄里創(chuàng)建一個(gè) templates 目錄反浓。Django 將會(huì)在這個(gè)目錄里查找模板文件。

你項(xiàng)目中setting.py的 TEMPLATES 配置項(xiàng)描述了 Django 如何載入和渲染模板赞哗。默認(rèn)的設(shè)置文件設(shè)置了 DjangoTemplates 后端雷则,并將 APP_DIRS 設(shè)置成了 True。這一選項(xiàng)將會(huì)讓 DjangoTemplates 在每個(gè) INSTALLED_APPS 文件夾中尋找 "templates" 子目錄肪笋。所以你只需要使用 polls/index.html 就可以引用到這一模板了月劈。

將下面的代碼輸入到剛剛創(chuàng)建的polls/index.html 模板文件中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django官方網(wǎng)站 </title>
    {% load staticfiles %}
</head>
<body>
    <p> {{ hello }}</p>
    <img src="{% static "img/2019-04-25.png" %}" alt="My image">
</body>
</html>

然后,讓我們更新一下 polls/views.py 里的 index 視圖來使用模板:

from django.http import HttpResponse
from django.template import loader

from .models import Question


def index(request):
    context = 'hello word'
    template = loader.get_template('polls/index.html')
    return HttpResponse(template.render(context, request))

上述代碼的作用是藤乙,載入 polls/index.html 模板文件猜揪,并且向它傳遞一個(gè)上下文(context)。這個(gè)上下文是一個(gè)字典坛梁,它將模板內(nèi)的變量映射為 Python 對(duì)象而姐。

一個(gè)快捷函數(shù): render()

「載入模板,填充上下文划咐,再返回由它生成的 HttpResponse 對(duì)象」是一個(gè)非常常用的操作流程拴念。于是 Django 提供了一個(gè)快捷函數(shù),我們用它來重寫 index() 視圖:

from django.shortcuts import render

from .models import Question


def index(request):
    context = 'hello word'
    return render(request, 'polls/index.html', context)

我們不再需要導(dǎo)入 loaderHttpResponse 褐缠。不過如果你還有其他函數(shù)(比如說 detail, results, 和 vote )需要用到它的話丈莺,就需要保持 HttpResponse 的導(dǎo)入。

總結(jié):

Django內(nèi)views常用到到有三個(gè)方法送丰,分別是:
1.HttpResponse() :它是作用是內(nèi)部傳入一個(gè)字符串或變量,然后發(fā)給瀏覽器弛秋。
2.render():它的作用就是將數(shù)據(jù)填充進(jìn)模板文件器躏,最后把結(jié)果返回給瀏覽器⌒仿裕可接收三個(gè)參數(shù)登失,一是request參數(shù),二是待渲染的html模板文件,三是保存具體數(shù)據(jù)的字典參數(shù)挖炬。
3.redirect()接受一個(gè)URL參數(shù)揽浙,表示讓瀏覽器跳轉(zhuǎn)去指定的URL.

舉例:

def index(request):
    # 業(yè)務(wù)邏輯代碼
    return HttpResponse("OK")

def index(request):
    # 業(yè)務(wù)邏輯代碼
    return render(request, "index.html", {"name": "monicx", "hobby": ["reading", "blog"]})

def index(request):
    # 業(yè)務(wù)邏輯代碼
    return redirect("https://blog.csdn.net/miaoqinian")

## 拋出 404 錯(cuò)誤?

如果指定問題 ID 所對(duì)應(yīng)的問題不存在,這個(gè)視圖就會(huì)拋出一個(gè) Http404 異常意敛。

我們暫時(shí)在 polls/detail.html 里把下面這段輸進(jìn)去:

{{ question }}

一個(gè)快捷函數(shù): get_object_or_404()?

嘗試用 get() 函數(shù)獲取一個(gè)對(duì)象馅巷,如果不存在就拋出 Http404 錯(cuò)誤也是一個(gè)普遍的流程。Django 也提供了一個(gè)快捷函數(shù)草姻,下面是修改后的詳情 detail() 視圖代碼:

from django.shortcuts import get_object_or_404, render

from .models import Question
# ...
def detail(request, question_id):
   question = get_object_or_404(Question, pk=question_id)
   return render(request, 'polls/detail.html', {'question': question})

也有 get_list_or_404() 函數(shù)钓猬,工作原理和 get_object_or_404() 一樣,除了 get() 函數(shù)被換成了 filter() 函數(shù)撩独。如果列表為空的話會(huì)拋出 Http404 異常敞曹。

更多內(nèi)容參考:編寫你的第一個(gè) Django 應(yīng)用账月,第 3 部分

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澳迫,隨后出現(xiàn)的幾起案子局齿,更是在濱河造成了極大的恐慌,老刑警劉巖橄登,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抓歼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡示绊,警方通過查閱死者的電腦和手機(jī)锭部,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來面褐,“玉大人拌禾,你說我怎么就攤上這事≌箍蓿” “怎么了湃窍?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)匪傍。 經(jīng)常有香客問我您市,道長(zhǎng),這世上最難降的妖魔是什么役衡? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任茵休,我火速辦了婚禮,結(jié)果婚禮上手蝎,老公的妹妹穿的比我還像新娘榕莺。我一直安慰自己,他們只是感情好棵介,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布钉鸯。 她就那樣靜靜地躺著,像睡著了一般邮辽。 火紅的嫁衣襯著肌膚如雪唠雕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天吨述,我揣著相機(jī)與錄音岩睁,去河邊找鬼。 笑死锐极,一個(gè)胖子當(dāng)著我的面吹牛笙僚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灵再,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肋层,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼亿笤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栋猖,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤净薛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蒲拉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肃拜,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年雌团,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了燃领。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锦援,死狀恐怖猛蔽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灵寺,我是刑警寧澤曼库,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站略板,受9級(jí)特大地震影響毁枯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叮称,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一种玛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓤檐,春花似錦蒂誉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括堤。三九已至碌秸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悄窃,已是汗流浹背讥电。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轧抗,地道東北人恩敌。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像横媚,于是被迫代替她去往敵國(guó)和親纠炮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子月趟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容