1. 程式人生 > >(四)Django2——檢視與模板

(四)Django2——檢視與模板

上一篇中瞭解瞭如何建立模型,新增應用等,

那這一篇,將會引入自定義檢視(html)

在 Django 中,網頁和其他內容都是從檢視派生而來。每一個視圖表現為一個簡單的 Python 函式(或者說方法,如果是在基於類的視圖裡的話)。Django 將會根據使用者請求的 URL 來選擇使用哪個檢視(更準確的說,是根據 URL 中域名之後的部分)。

在你上網的過程中,很可能看見過像這樣美麗的 URL: "ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B" 。別擔心,Django 裡的 URL 規則 要比這優雅的多!

一個 URL 模式定義了某種 URL 的基本格式——舉個例子:/newsarchive/<year>/<month>/。

為了將 URL 和檢視關聯起來,Django 使用了 'URLconfs' 來配置。URLconf 將 URL 模式對映到檢視。

本本章只會介紹 URLconf 的基礎內容,你可以看看 URL排程器 以獲取更多內容。

建立檢視

blog/views.py程式碼如下

from django.shortcuts import render,get_object_or_404
from django.http import Http404
from .models import *

# index
def index(request):
    articles_list = Articles.objects.all()
    sort_list = Sorts.objects.all()
    context = {
        'articles_list': articles_list,
        'sort_list' : sort_list,
    }
    return render(request, 'index.html', context)

# article info 
def info(request,article_id):
    article = get_object_or_404(Articles,id = article_id)
    return render(request, 'info.html', {'article':article})

獲取文章列表、及接收引數根據文章id查詢文章詳情

把這些新檢視新增進 blog/.url.py模組裡,只要新增幾個 url() 函式呼叫就行:

from django.urls import path

from . import views

urlpatterns =[
    path('index/',views.index),
    path('article/info/<int:article_id>/', views.info , name ='articleInfo')
]

然後看看你的瀏覽器,如果你轉到 "article/info/1" ,Django 將會執行 info() 方法並且展示你在 URL 裡提供的article_id。

當某人請求你網站的某一頁面時——比如說, "article/info/1" ,Django 將會載入 mysite.urls 模組,因為這在配置項 ROOT_URLCONF 中設定了。然後 Django 尋找名為 urlpatterns 變數並且按序匹配正則表示式。在找到匹配項 'article/info',它切掉了匹配的文字("article/info/"),將剩餘文字——"1/",傳送至 'blog.urls' URLconf 做進一步處理。在這裡剩餘文字匹配了 '<int:article_id>/',使得我們 Django 以如下形式呼叫 info()

每個檢視必須要做的只有兩件事:返回一個包含被請求頁面內容的 HttpResponse 物件,或者丟擲一個異常,比如 Http404 。至於你還想幹些什麼,隨便你。

你的檢視可以從資料庫裡讀取記錄,可以使用一個模板引擎(比如 Django 自帶的,或者其他第三方的),可以生成一個 PDF 檔案,可以輸出一個 XML,建立一個 ZIP 檔案,你可以做任何你想做的事,使用任何你想用的 Python 庫。

Django 只要求返回的是一個 HttpResponse ,或者丟擲一個異常。

Rander()

「載入模板,填充上下文,再返回由它生成的 HttpResponse 物件」是一個非常常用的操作流程。於是 Django 提供了一個快捷函式。

丟擲 404 錯誤get_object_or_404()

嘗試用 get() 函式獲取一個物件,如果不存在就丟擲 Http404 錯誤也是一個普遍的流程。Django 也提供了一個快捷函式,下面是修改後的詳情 detail() 檢視程式碼:

程式碼如上blog/views.py展示的程式碼

為什麼我們使用輔助函式 get_object_or_404() 而不是自己捕獲 ObjectDoesNotExist 異常呢?還有,為什麼模型 API 不直接丟擲 ObjectDoesNotExist 而是丟擲 Http404 呢?

因為這樣做會增加模型層和檢視層的耦合性。指導 Django 設計的最重要的思想之一就是要保證鬆散耦合。一些受控的耦合將會被包含在 django.shortcuts 模組中。

使用模板

截下來來建立我們的靜態頁面

在blog/目錄建立static,templates資料夾,現在我們的目錄是這樣

在setting檔案中修改

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static/'),
)

現在再來編輯我們的html頁面,首先是index.html

在html頁面頂部引入

{% load staticfiles %}

所有引入靜態頁面參考如下方式

<link href="{% static 'css/base.css'  %}" rel="stylesheet">

然後通過標籤,展示我們的文章列表

    {% if articles_list %}
      {% for article in articles_list %}
      <li>
        <h3><a href="/article/info/{{ article_id }}/">{{article.art_title}}</h3>
        <p>{{article.art_content}}</p>
        <span>{{article.art_date}}</span><span>閱讀數:{{article.art_views}}</span><span>評論數:{{article.art_comment_count}}</span>
      </li>
      {% endfor %}
    {% endif %}

模板系統統一使用點符號來訪問變數的屬性。在示例 {{ article.art_views }} 中,首先 Django 嘗試對 article 物件使用字典查詢(也就是使用 obj.get(str) 操作),如果失敗了就嘗試屬性查詢(也就是 obj.str 操作),結果是成功了。如果這一操作也失敗的話,將會嘗試列表查詢(也就是 obj[int] 操作)。

去除模板中的硬編碼 URL

上述中我們的a標籤寫到

<a href="/article/info/{{ article_id }}/"

問題在於,硬編碼和強耦合的連結,對於一個包含很多應用的專案來說,修改起來是十分困難的。然而,因為你在 blog.urls 的 url() 函式中通過 name 引數為 URL 定義了名字,你可以使用 {% url %} 標籤代替它:

<a href="{% url 'articleInfo' article.id %}">

這個標籤的工作方式是在blog.urls 模組的 URL 定義中尋具有指定名字的條目。你可以回憶一下,具有名字 'info' 的 URL 是在如下語句中定義的:

   path('article/info/<int:article_id>/', views.info , name ='articleInfo')

所以以後更改只需要更改 name就可以了

ok現在開啟我們的頁面看看效果吧