Python 3 Tutorial 第十堂(1)使用模版系統


在〈Python 3 Tutorial 第九堂(2)撰寫 Django 中第一個 View〉中,我們在 polls/views.py 中撰寫回應結果,雖然概念上 polls/views.py 是屬於 View 的一部份,不過實際的畫面組織不建議撰寫在這當中,想想看,如果你想要 HTML 輸出,那麼直接在 polls/views.py 中撰寫 HTML 輸出,程式碼與 HTML 糾結在一起,會是什麼樣的混亂結果。

概念上 polls/views.py 是屬於 View 的一部份,不過建議當中只使用 Python 程式碼來準備畫面中動態的資料部份,但不包括頁面組織以及相關的呈現邏輯。你可以使用 Django 的模版系統,將頁面組織以及相關的呈現邏輯,從 Python 程式碼中抽離出來,你可以如下圖中,使用模版標籤的元素來控制呈現邏輯,使用 dot 查找語法來取得文脈變數(Context variable):

使用模版系統

練習 15:撰寫模版

在你的 polls 目錄中建立一個 templates 目錄,Django 會在這個目錄中尋找模版,在 templates 目錄中建立另一個名為 polls 的目錄,並在其中建立一個名為 index.html 的檔案。

也就是說,現在你建立了一個模版檔案 polls/templates/polls/index.html,接著將以下的程式碼放入模版之中:

{% 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 %} 

接著再建立一個名為 detail.html 的檔案,並撰寫以下的程式碼:

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

開啟 polls/views.py,並修改 indexdetail 函式為以下,記得 from import 的部份也要一致:

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

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

from .models import Question

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

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

# 其他程式碼不變...

其中 'latest_question_list' 用來設定文脈變數名稱,而 render 函式第二個引數 'polls/index.html' 用來設定要呈現的模版檔案名稱。

如果你沒做過〈Python 3 Tutorial 第九堂(1)ORM 操作〉中的 ORM 操作,現在可以執行 python3.5 manage.py shell 啟動 Python 互動環境,然後如下建立一個新的調查問題以及兩個選項:

from polls.models import Question, Choice
from django.utils import timezone
q = Question(question_text="What's new?", pub_date=timezone.now())
q.save()
q.choice_set.create(choice_text='Not much', votes=0)
q.choice_set.create(choice_text='The sky', votes=0)

執行 python3.5 manage.py runserver 之後,你應該可以在使用瀏覽器請求相關網址時,看到以下畫面:

使用模版系統