Tornado Web Framework – Template 之Model Binding(補充)

Tornado Web Framework – Template 之Model Binding(補充)

既上一篇,tornado如何建置web服務到套用template機制可以建立一個動態web網站(連結)

而template最棒的地方就是實現觀注點分離

然後以下展示一下如何透過template樣版來建立動態資料清單印出集合

還記得test的網站結構下有一個test.html檔案

{% extends __base.html %}
{% block content %}
<div class="container" style="padding: 60px 20px;">
    Hello , <font color="red">{{name}}</font>!!<br>
    <p>Welcome to Here!!</p>

    <p>
      <h3>我的推薦書單</h3>
      <div class="table-responsive">
        <table class="table">
             <thead>
              <tr>
                <th>編號</th>
                <th>書名</th>
                <th>出版社</th>
                <th>作者</th>
                <th>定價</th>
              </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
    </div>
    </p>

    <p>
        About Paul<br><br>

        我是一個it與程式開發的熱愛者<br><br>

        總愛玩一些新的、有趣的東西,以此站台記念<br><br>
    </p>

</div>
{% end %}

假定我們的book model如下:

創建一個recommand_book_model.py檔案定義我們的Model(註,若是放在同一個module下的話,之後可以直接使用,若是跨module的時候,就必須import)

class RecommandBookModel(object):
    def __init__(self, isbn, name, publisher, author, price):
        self.isbn = isbn
        self.name = name
        self.publisher = publisher
        self.author = author
        self.price = price

當我們請求這個網頁的時候,透過handler得知需要取得來自於後端資料庫的書單資料(例)

怎麼從資料庫取資料,我們先略過,假如已經取得資料了,我們希望binding到tempalte上可以直接self.render的時候,直接指定model名稱與值給render方法:

class HomeHandler( tornado.web.RequestHandler ):
    def get(self):

        #get book list from database
        book_list = [RecommandBookModel("978-986-201-788-3", "無瑕的程式碼-番外篇", "博碩文化", "Robert C. Martin", 340),
                     RecommandBookModel( "978-986-347-702-0", "Effective Python中文版", "碁峰資訊", "Brett Slatkin", 450 ),
                     RecommandBookModel( "978-986-94410-0-1", "時間的形狀", "經濟新潮社", "汪潔", 380 ),
                     ]

        self.render("test.html", name="Friend", book_list = book_list)

test.html的表格tbody標籤之間,我們可以這樣定義:

 <table class="table">
             <thead>
              <tr>
                <th>編號</th>
                <th>書名</th>
                <th>出版社</th>
                <th>作者</th>
                <th>定價</th>
              </tr>
            </thead>
            <tbody>
                {% for book in book_list %}
                <tr>{{book.isbn}}</tr>
                <tr>{{book.name}}</tr>
                <tr>{{book.publisher}}</tr>
                <tr>{{book.author}}</tr>
                <tr>{{book.price}}</tr>
                {% end %}
            </tbody>
        </table>

重新跑localhost:9999之後,我們就可以看到清單出來了,注意若是程式流程要使用{% statement %},若是binding value的話,就是透過{{model.attribulte}}

 

然而我有遇到model是在其他module裡面的情況,若是如此,沒有進行適當的import,template會報錯提示,例如沒有相關的屬性之類的訊息

這個時候,必須在template最上面引用 {% import xxxx.yyyyy.zzzzz.module %},那麼就可以正常引用進來了~

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *