使用pycharm開發web——django2.1.5(四)視圖和模板相關

来源:https://www.cnblogs.com/lovely-lisk/archive/2019/06/21/11062379.html
-Advertisement-
Play Games

劉老師說這塊很重要。。。。。 應該是很重要,大概看了一下,這裡面關於views中函數作用,大概看來可能就是相應請求,傳入數據和跳轉,基本功能上貌似這些框架都差不多吧(其實我並沒用過3個框架以上。。。。) 從功能上想,網站必然包含了許多實現具體功能和數據展示的頁面,而現在在做的就是構成這些。 那麼一個 ...


劉老師說這塊很重要。。。。。

應該是很重要,大概看了一下,這裡面關於views中函數作用,大概看來可能就是相應請求,傳入數據和跳轉,基本功能上貌似這些框架都差不多吧(其實我並沒用過3個框架以上。。。。)

從功能上想,網站必然包含了許多實現具體功能和數據展示的頁面,而現在在做的就是構成這些。

那麼一個網頁他的樣子(模板)就是html,那麼他的靈魂在這裡就是views。這樣想似乎就比較清楚。

在構思的時候都是預設軀體存在,設計者需要先設置他的靈魂

在polls/views.py中添加如下函數:

def detail(request, question_id):
    return HttpResponse("You're looking 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)

這裡可以大概得出結論,我們在views.py中做的所有函數幾乎都是返回了一個HttpResponse對象

這個對象呢有這樣幾個屬性:

content:表示返回的內容,字元串類型

charset:表示response採用的編碼字元集,字元串類型

status_code:響應的HTTP響應狀態碼 404什麼的

content-type:指定輸出的MIME類型


寫好這幾個函數,也就需要配置一下二級路由,伺服器找到app  polls的路徑我理解為了這裡的一級路由,是在pysite(我的web項目名)的urls裡面配置的,那麼當在app之下在有頁面時候同樣就需要在polls的urls中進行路徑配置,好讓伺服器找到對應的地址。

from django.urls import path

from . import views

urlpatterns = [
    # ex: /polls/
    path('', views.index, name='index'),
    # ex: /polls/5/
    path('<int:question_id>/', views.detail, name='detail'),
    # ex: /polls/5/results/
    path('<int:question_id>/results/', views.results, name='results'),
    # ex: /polls/5/vote/
    path('<int:question_id>/vote/', views.vote, name='vote'),
]
<int:question_id> 這個東西,這樣想,某個int類型的值,傳進來並將其賦給question_id變數,還記得前面我們在views中寫的函數嗎,其中參數除了request之外還有一個question_id,簡直伏筆,劉老師真騷人也。。。。
牛人寫書往往也這樣,開始看的你頭疼,知道看到某處,武功及大成,融會貫通,一通百通。
這時候你在localhost:8000/polls/某個數字 訪問的時候就會對應的出現不同效果,看detail函數就能理解到。
這些能看得到就證明靈魂已經能運轉了,雖然他還沒有軀體,可能就像一個嗷嗷待哺的賈維斯一樣吧,史塔克牛逼
path()達成的效果是這樣的,這裡已經是在找二級路由也就是,從你地址欄輸入的polls/後面開始找滿足參數裡面那個正則形式的,就調用視圖下某個函數
比如在
path('', views.index, name='index'),即為如果polls/後面莫得東西,那就走index函數去進行跳轉傳參,
path('<int:question_id>/', views.detail, name='detail'),如果polls/後面只跟了一個數字 那就調用那個views中叫detail的函數
and so on 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

然後劉老師搞了個能調用資料庫中信息展示的函數,也就是把detail進行了改變,讓頁面能正兒八經做些事,而不是傻冒的列印一句絕大多數字不會改變的字元串
更改一下vies.py
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)

學過mysql你看見order by 就知道他要排序,根據時間的相反數,鬼知道為什麼要用1970年到其日期之間的毫秒數,知道也不想理解,內心無法接收。所以他這裡根據時間的相反數,可以想象,這個毫秒數越大時間越“新”,這裡不用多想,框架後面對應的必然有一條ORDER BY語句,那個是要傳一個列進去,這句話預設是升序的,如果這樣的話,最新的時間就會排在最下麵了。而我們想要的影噶是把最新的放在上面,後來者居上,這就解釋得通了。(強行解釋)

好的detail有了他的靈魂,你還需要給他一個軀體,這怎麼感覺像是在看復仇者聯盟2一樣,旺達的老公要出來了,搞了這麼久原來是托尼給賈維斯找了個女朋友,還送了個定情原石。哦!woc,女朋友,,,,,女。。。。。。。,是啊百合是多麼純潔而浪漫

咳咳,繼續

django中提到一個渲染,說白了就是用一個HttpResponse對象把東西傳過去。然後頁面再執行一些東西,頁面,想想能幹啥?不就是顯示屏和輸入設備的功能嗎,給你看和讓你點讓你敲。

在這裡,當我們創建項目的時候就有一個雪青色的文件夾放在那裡,叫做templates。。。。。(邪惡),這裡只是拿出來說這個名字,你要放的模板不在這裡,你需要在你對應的app的目錄下麵新建一個文件夾叫做templates,而且在這之下新建一個和app同名的文件夾比如這裡的路徑是polls/templates/polls/

這裡是你接下來要存放模板的地方,這樣做是為瞭解決一些共有問題,很多時候集體主義狀態很亂,雖然現實中多數由於管理者能力不足導致,但是本身確實有局限性,比如這裡說你們都是女生,那麼單說女生,誰知道找哪一位呢?集體主義有時候強制把一些東西變成了公共狀態,而如果設定不是很合理就必然會亂,想想感覺得到,當然事物是相對的,集體的弊端需要個人彌補,個人也有難以單獨實現的事情。陰陽調和即可。

所以請按照這個規範來創建,圈裡都這樣 乾,你乾是不幹?劉老師教程說叫做獨立命名空間,帥氣

由於接下來要在index頁面搞事情,

先吧index的靈魂寫好:

資料庫是要自己搞的哦,具體參考前面的篇章

在views.py中修改:

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))

 

創建好目錄之後進去新建一個html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</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>#}
        <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
</body>
</html>

這就是現在的效果,裡面加了一個超鏈接,超鏈接的內容是從資料庫中查詢到的question_text的內容,如果想去做些很好看的頁面,建議去mooc看html、css等學一翻就好,人活著沒意思,讓你前進的是好奇心。

然後劉老師告訴你,剛纔的寫法過時了,嘿嘿,我們現在用render()

每次自己看東西到這種就感覺很******,但是好在這樣是一個理解的過程

來,再改views.py

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)

但是註意了,這裡幾個不同的方法,最終實際上都是一個HttpResponse對象,是不是一種萬物歸一的感覺,茅塞頓開

 

然後劉老師講了異常處理,這裡也就是404的而已

開始是這樣的(views.py):

from django.http import Http404
from django.shortcuts import render

from .models import Question
# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})

然後是這樣的:

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})

一jio吧try except踢到九霄雲外,就用而言,請你直接上高級的。

好的,現在再去寫一個detail的模板

看看視圖中detail方法(函數)中的語句,從資料庫表(類)Question model對應的表中取到主鍵等於傳入question_id的Question對象並把它字典形式傳入並渲染模板

detail.html 放在哪裡就不用說了,都是polls的模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>detail</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>

由於在寫model時候說過的,這裡的Question和Choice是有所關聯的,兩個類就可以相互去做一些查詢,算是django的騷操作了,所以當把question傳過來後,detail.html就開始瘋狂的使用他,而遍曆數據卻在choice的表中

這就很有意思了

那麼效果是:

刪除模板中硬編碼的urls

什麼叫硬編碼的urls?打個比方,有一波人賣房子的人,另一波叫賣房子的人,賣房子原來自己聯繫買家,結果這些人又很噁心,一會兒想買一會兒不想買,搞來搞去,同一個買家找人找的快費勁死,後來這些賣家全幹掉,交給中介去高了,對於買家來說,只要應付中介就完事了。。。。。說了好長

這裡的硬核url就是那種耐衝擊性很差的存在,這個詞好像是在水污染控制工程裡面第一次學,某些東西無法抵抗水質的突變

當我們的路徑發生變化的時候,如果html頁面上直接填寫的是頁面路徑,那就需要重新修改這個地方,一處改一個,一萬處就涼涼,所以這裡要用別名

對比一下index中的兩句:

{#被註釋 <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>#}
        <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

在urls.py中我們有寫過name=""這個地方,這裡就是起別名,最終用到html這裡很舒服,這是要修改的地方,這樣的方法是很提高效率的

 

url命名空間:

在polls/urls.py中加入變數app_name='polls'

那麼此時再對index.html文件中的那個超鏈接地址進行修改吧,指明,是polls的detail。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</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>#}
        <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
</body>
</html>

 

from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
    path('', views.index, name='index'),
    # ex:/polls/5
    path('<int:question_id>/', views.detail, name='detail'),
    # ex:/polls/5/results
    path('<int:question_id>/results/', views.results, name='results'),
    # ex:/polls/5/vote/
    path('<int:question_id>/vote/', views.vote, name='vote'),
    # 添加新的單詞'specifics'有了中介之後這裡就是改了也無妨
    path('specifics/<int:question_id>/', views.detail, name='detail'),
]

兩點了睡了睡了

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 最近在學習netty的相關知識,也在看netty的源碼,光看不練假把式,所以也正好利用自己學習的機會寫幾篇netty的分析文章,主要還是一些源碼解析的文章,一方面有輸出會促使自己在看源碼,學習原理的過程中更系統,更深入,同時也能加強記憶,鞏固對知識的理解。 關於netty的簡介和應用我就不做介 ...
  • 1.SOA SOA(Service-Oriented Architecture)面向服務架構,將應用程式不同功能單元(稱為服務)進行拆分,並通過這些服務之間定義良好的介面和契約聯繫起來。 SOA 不是特定的規範,是一種技術思想,一種理念,上圖為 SOA 架構的參考模型。 SOA 是一種粗粒度、松耦合 ...
  • 實驗三、數據挖掘之決策樹 一、實驗目的 1. 熟悉掌握決策樹的原理, 2. 熟練掌握決策樹的生成方法與過程 二、實驗工具 1. Anaconda 2. sklearn 3. pydotplus 三、實驗簡介 決策樹是一個非參數的監督式學習方法,主要用於分類和回歸。演算法的目標是通過推斷數據特征,學習決 ...
  • 實驗一、數據處理之Numpy 一、實驗目的 1. 瞭解numpy庫的基本功能 2. 掌握Numpy庫的對數組的操作與運算 二、實驗工具: 1. Anaconda 2. Numpy 三、Numpy簡介 Numpy 的英文全稱為 Numerical Python,指Python 面向數值計算的第三方庫。 ...
  • 前言 開心一刻 十年前,我:我交女票了,比我大兩歲。媽:不行!趕緊分! 八年前,我:我交女票了,個比我小兩歲,外地的。媽:你就不能讓我省點心? 五年前,我:我交女票了,市長的女兒。媽:別人還能看上你?分了吧! 今年,我挺著大肚子踏進家門。媽:閨女啊,你終於開竅了 ! 前情回顧 Spring拓展介面之 ...
  • 反向整數 給定一個 32 位有符號整數,將整數中的數字進行反轉,如果超出整數的最大或者最小範圍返回0 更多文章查看個人博客 "個人博客地址:反向整數" 方法一 利用StringBuilder的reverse方法,將數字轉換成字元反轉然後再轉換回整數 java public int reverseIn ...
  • N皇後 難度分類 困難 題目描述 n皇後問題研究的是如何將 n個皇後放置在 n×n 的棋盤上,並且使皇後彼此之間不能相互攻擊。 上圖為 8 皇後問題的一種解法。 給定一個整數 n,返回所有不同的 n 皇後問題的解決方案。 每一種解法包含一個明確的 n 皇後問題的棋子放置方案,該方案中 'Q' 和 ' ...
  • 老男孩python全棧第三期視頻老男孩python全棧第三期視頻老男孩python全棧第三期視頻老男孩python全棧第三期視頻 老男孩python全棧第三期視頻老男孩python全棧第三期視頻老男孩python全棧第三期視頻老男孩python全棧第三期視頻 所屬網站分類: 資源下載 > pytho ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...