3、視圖和模板

續上一篇,這一篇 著重于創建公共接口——“視圖”

第三部分——3、視圖和模板

  • 1、概述
  • 2、編寫更多視圖
      • 原理——django依次訪問了什么文件
  • 3、寫一個真正有用的視圖
    • 一個快捷函數 render() render——渲染
  • 4、拋出404錯誤
    • 一個快捷函數 get_object_or_404()
  • 5、使用模板系統
  • 6、去除模板中的硬編碼URL
  • 7、為URL名稱添加命名空間

1、概述

  • Django中視圖——一類具有相同功能和模板網頁的集合
  • 網頁和其他內容由視圖派生而來。
  • 視圖是一個python函數or方法
  • 根據用戶請求的URL(域名之后的部分)來選擇使用哪個視圖
  • 將URL與視圖關聯起來——URLconfs(將URL映射到視圖)來配置

2、編寫更多視圖

在 polls/views 增加

def detail(request,question_id):return HttpResponse("You're loooking at question %s." % question_id)def results(request,question_id):response="You're looking at the results of question & s"return  HttpResponse(response % question_id)def vote(request,question_id):return HttpResponse("You're voting on question %s." % question_id)

將視圖添加進 polls/urls 模塊中

urlpatterns=[path("",views.index,name="index"),path("<int:question_id>/",views.detail,name="detail"),path("<int:question_id>/results/",views.results,name="results"),path("<int:question_id>/vote/",views.vote,name="vote"),
]

接下來訪問“/polls/34/”它將運行detail()函數,顯示為:
在這里插入圖片描述
同理訪問“/polls/2/results/”,或者訪問“/polls/2/vote/”:將看到:
在這里插入圖片描述
在這里插入圖片描述

原理——django依次訪問了什么文件

  1. 訪問根urls.py文件,即ROOT_URLCONF,按順序遍歷這些模式,匹配path(“polls/”,include(“polls.urls”)),并將剩余的文本發送給polls.urls在這里插入圖片描述
  2. Django 會匹配 path(‘int:question_id/’, views.detail, name=‘detail’),其中 ‘int:question_id/’ 表示將URL路徑的這一部分解析為整數,并作為 question_id 參數傳遞給 detail 視圖函數。在這里插入圖片描述
  3. 在polls/views,detail 函數接收兩個參數:request 和 question_id。當你訪問 /polls/34/ 時,question_id 的值為 34,因此視圖函數會返回包含 “You’re looking at question 34.” 的響應。

總結:
1、Django加載項目的URL配置:mysite/urls.py。
2、匹配到包含的應用URL配置:polls/urls.py。
3、解析URL路徑參數并調用相應視圖函數:將 question_id 解析為 34,并調用 detail 視圖函數。
4、視圖函數處理請求并返回響應:detail 函數生成并返回響應。

3、寫一個真正有用的視圖

視圖必須做的只有兩件事:返回一個包含被請求頁面的HttpResponse對象。或者拋出一個異常。

視圖還可以做什么?視圖可以從數據庫讀記錄,可以使用一個模板引擎,,可以生成一個pdf文件,可以輸出一個xml,可以創建一個zip文件,可以做任何你想做的事情。

接下來修改polls/views/index()函數,顯示最近的五個問題

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)

在這里插入圖片描述

  • 這里有一個問題,頁面的代碼寫死在了視圖函數里,這里解釋一下什么叫“寫死”,以及它的弊端

當我們說頁面的設計“寫死”在視圖函數里時,意思是視圖函數中包含了生成頁面內容的具體代碼。如果你想修改頁面的外觀或布局,就必須直接編輯這些視圖函數。這種做法的問題在于:
1、難以維護和更新:每次需要修改頁面的外觀或布局時,都必須直接更改視圖函數中的代碼,可能導致代碼變得復雜和難以維護。
2、代碼與內容耦合:視圖函數不僅負責處理請求邏輯,還負責生成HTML內容,使得業務邏輯和頁面設計耦合在一起
3、復用性差:如果不同的視圖函數需要共享相同的HTML結構或樣式,每個視圖函數都必須重復相同的HTML代碼,導致代碼重復和不易復用。

所以要使用Django的模板系統,只需要創建一個視圖,就可以將頁面的設計從代碼里分離出來

首先,創建polls/templates目錄。Django會在這個目錄里查找模板文件

接著創建templates/polls/index.html

  • 避免模板文件名稱沖突,我們應該將模板文件放在與應用同名的子文件夾中。這樣做的好處是,如果你有多個應用程序,它們可以使用相同名稱的模板文件而不會互相沖突
  • 命名空間:為了幫助Django區分不同應用的模板,我們將模板文件放在與應用同名的子文件夾中。這就是所謂的命名空間。例如,對于 polls 應用,我們應該在 polls/templates 目錄下再創建一個 polls 子目錄。

在index.html文件中:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Polls Index</title>
</head>
<body>{% if latest_question_list %}<ul>{% for question in latest_question_list %}<li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>{% endfor %}</ul>
{% else %}<p>No polls are available.</p>
{% endif %}
</body>
</html>
<ul>:表示無序列表(unordered list)。通常用于列出項目,每個項目由 <li>(列表項)標簽表示。<li>:表示列表中的項目(list item)。在無序列表 <ul> 或有序列表 <ol> 中使用。<a>:表示超鏈接(anchor)。用于創建鏈接,可以導航到其他頁面或資源。href 屬性指定鏈接目標。<p>:表示段落(paragraph)。用于定義文檔中的段落,瀏覽器會自動在段落前后添加一些空白,以便段落與其他內容分開。{{ }}:Django模板語法,用于輸出變量的值。例如,{{ question.id }} 輸出問題的ID,{{ question.question_text }} 輸出問題的文本。{% %}:Django模板標簽,用于執行邏輯語句或控制流。例如,{% if latest_question_list %} 檢查 latest_question_list 是否有數據,{% for question in latest_question_list %} 循環遍歷 latest_question_list 中的每個問題,{% endif %} 結束 if 語句,{% endfor %} 結束 for 循環。

接下來更新polls/views.py中的Index視圖

def index(request):latest_question_list=Question.objects.order_by("-pub_date")[:5]template= loader.get_template("polls/index.html")context={"latest_question_list": latest_question_list,}return HttpResponse(template.render(context,request))#模板渲染

一個快捷函數 render() render——渲染

載入模板,填充上下文,再返回由它生成的HttpResponse對象
這是一個非常常見的操作流程,于是Django提供了一個快捷函數,我們用它來重寫index()視圖

def index(request):latest_question_list=Question.objects.order_by("-pub_date")[:5]context={"latest_question_list": latest_question_list,}return render(request,"polls/index.html",context)

此時,就不再需要導入loader和HttpResponse啦

4、拋出404錯誤

接下來我們來處理 投票詳情頁面——它會顯示指定投票的問題標題

from django.http import Http404
def detail(request,question_id):try:question=Question.objects.get(pk=question_id)except Question.DoesNotExist:#當指定問題ID所對應的問題不存在,這個視圖就會拋出一個Http404錯誤raise Http404("Question does not exist")return render(request,"polls/detail.html",{"question":question})

一個快捷函數 get_object_or_404()

嘗試用get函數來獲取一個對象,如果不存在就拋出一個404錯誤
這是一個普遍的流程,Django也提供了一個快捷的函數,下面是修改的detail代碼

from django.shortcuts import get_object_or_404
def detail(request,question_id):question=get_object_or_404(Question,pk=question_id)return render(request,"polls/detail.html",{"question":question})

使用輔助函數 get_object_or_404,而不是自己捕獲ObjectDoesNotExist異常?為什么模型API不直接拋出ObjectDoesNotExist,而是拋出Http404呢?
這樣會增加 模型層 和 視圖層 的 耦合性。但是指導Django設計的最重要的思想之一就是要 保證松散耦合。yi==一些受控的耦合會被包含在django.shortcuts模塊中。

5、使用模板系統

在 polls/detail.html 中:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Polls Details</title>
</head>
<body><h1>{{question.question_text}}</h1><ul>{% for choice in question.choice_set.all %}<li>{{ choice.choice_text }}</li>{% endfor %}</ul>
</body>
</html>

6、去除模板中的硬編碼URL

在polls/index.html 中編寫投票鏈接時,鏈接是硬編碼

 <li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>

這種 硬編碼、強耦合的方法的問題在于,在具有大量模板的項目中更改url變得更有挑戰性。還記得在polls/urls模塊中,path()函數中定義了name參數,你可以通過使用
{% url %} 模板標簽來消除對url配置中定義的特定的URL路徑的依賴
將其修改為:

<li><a href="{% url"detail"question.id %}">{{question.question_text}}</a></li>

回憶一下在polls.urls中:
在這里插入圖片描述
如果你想改變投票詳情頁面的url 比如想改成polls/specifics/12/,你不需要在模板里(包括其他模板),只要在polls/urls.py里稍微修改一下就行:

path("specifics/<int:question_id>/",views.detail,name="detail"),

此時訪問http://127.0.0.1:8000/polls/specifics/2/將看到
在這里插入圖片描述

7、為URL名稱添加命名空間

本教程中只有一個應用:polls,在實際中可能會有好幾十個應用。那么如果兩個應用出現重名的url時,Django怎么分辨呢?比如,polls應用有detail視圖,另一個博客應用也有detail視圖,Django如何知道 {% url %} 到底對應的是哪個應用呢,需要在兩個地方做出聲明:
1、在polls.urls中設置命名空間:
在這里插入圖片描述
2、在模板標簽處(index.html/a href)添加聲明
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44244.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44244.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實時數倉和離線數倉的區別是什么,企業該如何選擇合適的數倉架構?

目錄 一、離線數倉 1. 離線數倉是什么&#xff1f; 2. 離線數倉的特點 3. 離線數倉的適用場景 二、實時數倉 1. 實時數倉是什么&#xff1f; 2. 實時數倉的特點 3. 實時數倉的適用場景 三、由數倉需求變化帶來的數據倉庫架構的演變 1. 傳統數倉架構 2. 離線大數據架構 3. Lambd…

高級IO_多路轉接之ET模式Reactor

文章目錄 Reactor是什么&#xff1f;LT模式 VS ET模式 示例代碼 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 Reactor是什么&#xff1f; Reactor模式是一種事件驅動的并發模型&#xff0c;它通過將事件處理邏輯與事件分發機制解耦&#xff0c;實現…

maven如何處理依賴沖突的問題?

Maven是一個強大的Java項目管理工具&#xff0c;它使用一個名為pom.xml的文件來管理項目的構建過程和依賴關系。當項目中出現依賴沖突時&#xff0c;Maven使用一系列策略來解決這些問題。以下是Maven處理依賴沖突的一些常見方法&#xff1a; 1. 最近優先策略&#xff1a; -…

tensorflow之欠擬合與過擬合,正則化緩解

過擬合泛化性弱 欠擬合解決方法&#xff1a; 增加輸入特征項 增加網絡參數 減少正則化參數 過擬合的解決方法&#xff1a; 數據清洗 增大訓練集 采用正則化 增大正則化參數 正則化緩解過擬合 正則化在損失函數中引入模型復雜度指標&#xff0c;利用給w增加權重&#xff0c;…

點線面推進未來智造

如今&#xff0c;寧波擁有門類齊全的制造業體系&#xff0c;形成了以石油化工、汽車及零部件、電工電器、紡織服裝等為支柱的產業集群。 寧波工業的發展并非一蹴而就&#xff0c;藍卓總經理譚彰詳細解讀了寧波制造業的發展歷程與當下目標&#xff0c;從工業小市到工業大市、工業…

基于Matlab和Python泰勒圖的繪制

一、泰勒圖介紹 泰勒圖:泰勒圖1常用于評價模型的精度,常用的精度指標有相關系數,標準差以及均方根誤差(RMSE)。一般而言,泰勒圖中的散點代表模型,輻射線代表相關系數,橫縱軸代表標準差,而虛線代表均方根誤差。泰勒圖一改以往用散點圖這種只能呈現兩個指標來表示模型精度…

Qt使用筆記1(智能指針,deleteLater,多屏)

1、Qt智能指針 1.1、QPointer &#xff1a;解決野指針問題&#xff0c;必須是QObject對象。 1.2、QScopedPoint&#xff1a;作用域指針&#xff0c;出作用域自動釋放。 1.3、QScopedArrayPoint&#xff1a;作用域數組指針&#xff0c;出作用域自動釋放數組。 1.4、QSharedP…

RedHat運維-Ansible自動化運維基礎20-從ansible-galaxy下載role

1. 社區管理的role倉庫&#xff1a;___________________________________&#xff1b; 2. 社區管理的role倉庫&#xff1a;___________________________________&#xff1b; 3. 社區管理的role倉庫&#xff1a;___________________________________&#xff1b; 4. 在ansible …

Python數據結構的庫之Fuk使用詳解

概要 fuk 是一個用于處理 Python 數據結構的庫,全稱為 "Fast and Uncomplicated Kit"。它提供了一系列高效、簡潔的數據結構實現,以及對 Python 內置數據結構的擴展。通過使用 fuk,開發者可以更加方便地處理列表、集合、字典等數據類型,提高代碼的執行效率和可讀…

vite+vue3拍照上傳到nodejs服務器

一:效果展示: 拍照效果 二:Nodejs后端接口代碼: 三:前端完整代碼:

Vue基礎--v-model/v-for/事件屬性/偵聽器

目錄 一 v-model表單元素 1.1 v-model綁定文本域的value 1.1.1 lazy屬性&#xff1a;光標離開再發請求 1.1.2 number屬性&#xff1a;如果能轉成number就會轉成numer類型 1.1.3 trim屬性&#xff1a;去文本域輸入的前后空格 1.2v-model綁定單選checkbox 1.3代碼展示 二 …

esp8266+micropython+irsend紅外發射調試記錄

在網上搜索esp8266micropython的紅外發射庫&#xff0c;沒找到&#xff0c;發現 接收庫是有的&#xff0c;可以參考&#xff1a;基于MicroPython的ESP8266連接外設IO&#xff08;二&#xff09;_micropython 紅外接收-CSDN博客 可惜沒有發射&#xff0c;很不方便。 這里都有介…

PHP財務記賬管理系統小程序源碼

理財小能手必備&#xff01;揭秘財務記賬管理系統的魔力? &#x1f31f; 引入篇&#xff1a;告別糊涂賬&#xff0c;擁抱財務自由 你是否曾為月底的賬單頭疼不已&#xff1f;是否覺得自己的錢總是莫名其妙地消失&#xff1f;別擔心&#xff0c;財務記賬管理系統來拯救你的錢…

【機器學習】必會數學知識:一文掌握數據科學核心數學知識點(下),收藏~

核心數學知識點 1、引言2、數據科學必會數學知識2.13 K均值聚類2.14 決策樹2.15 隨機森林2.16 梯度下降2.17 隨機梯度下降&#xff08;SGD&#xff09;2.18 卷積2.19 拉普拉斯變換2.20 傅里葉變換2.21 信息論2.22 時間序列分析2.23 生成模型與判別模型2.24 支持向量機&#xff…

git merge 分支回退

1. 使用git merge --abort&#xff08;如果合并正在進行中&#xff09; git merge --abort2. 使用git reset&#xff08;合并已經提交&#xff09; 硬重置&#xff08;--hard&#xff09;會丟棄所有合并后的更改&#xff0c;并將HEAD指向合并前的提交。這是最徹底的方式&…

DDOS 攻擊原理

DDoS攻擊的基本原理 資源耗盡&#xff1a;攻擊者通過發送大量的請求或數據包&#xff0c;耗盡目標系統的資源&#xff08;如帶寬、CPU、內存等&#xff09;&#xff0c;使其無法處理正常的用戶請求。 分布式攻擊&#xff1a;與傳統的DoS&#xff08;拒絕服務&#xff09;攻擊不…

Java-面向對象基礎

在面向對象編程&#xff08;Object-Oriented Programming, OOP&#xff09;中&#xff0c;類&#xff08;Class&#xff09;是一種用來描述對象共同特征的藍圖或模板。它是創建對象的原型&#xff0c;定義了對象可以有的屬性&#xff08;字段&#xff09;和行為&#xff08;方法…

物聯網應用,了解一點 WWAN全球網絡標準

WWAN/蜂窩無線電認證&#xff0c;對跨地區應用場景&#xff0c;特別重要。跟隨全球業務的腳步&#xff0c;我們像大唐先輩一樣走遍全球業務的時候&#xff0c;了解一點全球化的 知識信息&#xff0c;就顯得有那么點意義。 NA &#xff08;北美&#xff09;&#xff1a;美國和加…

OpenSSH漏洞(CVE-2024-6387)

漏洞信息 請參考:OpenSSH遠程代碼執行漏洞 (CVE-2024-6387) 影響范圍 8.5p1 <= OpenSSH < 9.8p1 參考鏈接中內容補充 利用方式 關于OpenSSH漏洞CVE-2024-6387,攻擊者可以利用一個有用的代碼路徑并在正確的時間點上被SIGALRM信號打斷,從而導致sshd(OpenSSH守護…

基于Python的嗶哩嗶哩數據分析系統設計實現過程,技術使用flask、MySQL、echarts,前端使用Layui

背景和意義 隨著互聯網和數字媒體行業的快速發展&#xff0c;視頻網站作為重要的內容傳播平臺之一&#xff0c;用戶量和內容豐富度呈現爆發式增長。本研究旨在設計并實現一種基于Python的嗶哩嗶哩數據分析系統&#xff0c;采用Flask框架、MySQL數據庫以及echarts數據可視化技術…