前一篇文章中,我們設計的profile頁面可以顯示用戶發佈的博客內容,每條內容前還帶有頭像。現在我希望在index頁也能顯示這些內容。我可以把相關的代碼拷貝到index頁面,但這不是一個好的做法,因為一旦需要修改,我們就必須在兩個地方都修改。因此,我們可以創建子模板,然後我們在user.html和index.html模板中都引用這個子模版。這裡我們新建一個_post.html文件作為子模板。內容如下:
要使用這個子模版,我們需要使用Jinja2的include語句:
現在,新的用戶profile頁做好了,但是顯示的內容還很少。用戶有時候想多展示一些內容,或者網站想多獲得一些用戶的信息。這裡,我們希望用戶提交一些關於自己的介紹,並且跟蹤用戶訪問這個網站時上次訪問的時間。
要支持上述需求,首先要在數據庫的user表進行擴展。而我們要做的就是在user類中增加屬性。
注意每次修改了數據庫的表,都需要進行一次數據庫的遷移。這點我們已經在之前的文章中介紹過了。這裡把命令列出來:
flask db migrate -m "new fields in user model"
flask db upgrade
完成上述更新之後,數據庫中的數據不會被破壞,也就是說,你以前註冊過的用戶還能繼續使用。
下一步就是要把這兩個屬性在profile裡面展示出來:
{% if user.about_me %}
{{ user.about_me }}
{% endif %}{% if user.last_seen %}
Last seen on: {{ user.last_seen }}
{% endif %}但是這兩個屬性並沒有賦值,因此目前依然顯示不出來。
先看last_seen是如何實現的吧。簡單起見,我們只給它設置訪問前一個頁面時的時間。
為啥我們不需要寫db.session.add()來把last_seen寫入數據庫呢?因為當你引用current_user時,flask-login會調用這個user的載入回調函數,該函數會查詢數據庫,並把目標用戶放入當前session。
接下來就是about_me了,為啥這個放在最後呢?因為這裡涉及到用戶編輯並且post的過程,這相比last_seen來說更復雜一點。既然需要post,我們就要給用戶提供一個用於post的表單。
下面是如何顯示這個表單
最後是對這個表單的處理。
為了使用戶更容易訪問這個profile編輯頁面,我們頁給它增加一個鏈接
注意,只有當你訪問的使自己的profile時才能顯示編輯profile的鏈接。到這裡profile的內容介紹完了。有了以上的知識,你可以新增生日,住址,職業,教育背景等等其他新的屬性,如果需要的話。
閱讀更多 小輝算個球 的文章