學習python flask之八:使用Jinja2子模版功能,允許編輯profile

前一篇文章中,我們設計的profile頁面可以顯示用戶發佈的博客內容,每條內容前還帶有頭像。現在我希望在index頁也能顯示這些內容。我可以把相關的代碼拷貝到index頁面,但這不是一個好的做法,因為一旦需要修改,我們就必須在兩個地方都修改。因此,我們可以創建子模板,然後我們在user.html和index.html模板中都引用這個子模版。這裡我們新建一個_post.html文件作為子模板。內容如下:

學習python flask之八:使用Jinja2子模版功能,允許編輯profile

要使用這個子模版,我們需要使用Jinja2的include語句:

學習python flask之八:使用Jinja2子模版功能,允許編輯profile

現在,新的用戶profile頁做好了,但是顯示的內容還很少。用戶有時候想多展示一些內容,或者網站想多獲得一些用戶的信息。這裡,我們希望用戶提交一些關於自己的介紹,並且跟蹤用戶訪問這個網站時上次訪問的時間。

要支持上述需求,首先要在數據庫的user表進行擴展。而我們要做的就是在user類中增加屬性。

學習python flask之八:使用Jinja2子模版功能,允許編輯profile

注意每次修改了數據庫的表,都需要進行一次數據庫的遷移。這點我們已經在之前的文章中介紹過了。這裡把命令列出來:

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是如何實現的吧。簡單起見,我們只給它設置訪問前一個頁面時的時間。

學習python flask之八:使用Jinja2子模版功能,允許編輯profile

為啥我們不需要寫db.session.add()來把last_seen寫入數據庫呢?因為當你引用current_user時,flask-login會調用這個user的載入回調函數,該函數會查詢數據庫,並把目標用戶放入當前session。

接下來就是about_me了,為啥這個放在最後呢?因為這裡涉及到用戶編輯並且post的過程,這相比last_seen來說更復雜一點。既然需要post,我們就要給用戶提供一個用於post的表單。

學習python flask之八:使用Jinja2子模版功能,允許編輯profile

下面是如何顯示這個表單

學習python flask之八:使用Jinja2子模版功能,允許編輯profile

最後是對這個表單的處理。

學習python flask之八:使用Jinja2子模版功能,允許編輯profile

為了使用戶更容易訪問這個profile編輯頁面,我們頁給它增加一個鏈接

學習python flask之八:使用Jinja2子模版功能,允許編輯profile

注意,只有當你訪問的使自己的profile時才能顯示編輯profile的鏈接。到這裡profile的內容介紹完了。有了以上的知識,你可以新增生日,住址,職業,教育背景等等其他新的屬性,如果需要的話。


分享到:


相關文章: