劉老師說這塊很重要。。。。。 應該是很重要,大概看了一下,這裡面關於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'), ]
兩點了睡了睡了