本教程內容已過時菩浙,更新版教程請訪問: Django 博客開發(fā)入門教程。
這是 Django 博客教程的第 10 篇,在閱讀此篇教程以前喳钟,請確保你已閱讀 Django 博客教程的前 9 篇:
1. Django 博客教程:前言
2. 搭建開發(fā)環(huán)境
3. 建立我們的 django 博客應用
4. 創(chuàng)建 django 博客的數據庫模型
5. 讓 django 完成翻譯——遷移數據庫模型
6. django 博客首頁視圖
7. 真正的 django 博客首頁視圖
8. 在 django admin 后臺發(fā)布我們的文章
9. 博客文章詳情頁
為了讓博客文章具有良好的排版屁使,顯示更加豐富的格式,我們使用 markdown 語法來書寫我們的博文奔则。markdown 是一種 html 文本標記語言蛮寂,只要遵循它約定的語法格式,markdown 的渲染器就能夠把我們寫的文章轉換為標準的 html 文檔易茬,從而讓我們的文章呈現更加豐富的格式酬蹋,例如標題、列表抽莱、代碼塊等等 html 元素范抓。由于 markdown 語法簡單直觀,不用超過 5 分鐘就可以掌握常用的標記語法食铐,這就是大家青睞使用 markdown 書寫 html 文檔的原因匕垫。下面讓我們的博客也支持使用 markdown 書寫。
將 markdown 格式的文本渲染成標準的 html 文檔是一個復雜的工作璃岳,好在已有好心人寫好了年缎,我們直接使用即可。首先安裝 markdown铃慷,這是一個 Python 第三方庫单芜,進入虛擬環(huán)境,然后 pip install markdown
安裝即可犁柜。
將 markdown 格式的文本渲染成 html 文本非常簡單洲鸠,只需調用這個庫的 markdown 方法即可。我們書寫的內容存在 Post 的 body 屬性里馋缅,回到我們的詳情頁視圖函數扒腕,對獲取的 post 的 body 的值做一下渲染,把 markdown 文本轉為 html 文本再傳遞給模板:
blog/details.py
import markdown
from django.shortcuts import render, get_object_or_404
from .models import Post
def detail(request, pk):
post = get_object_or_404(Post, pk=pk)
post.body = markdown.markdown(post.body,
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
'markdown.extensions.toc',
])
return render(request, 'blog/detail.html', context={'post': post})
這樣我們在模板中展示 post.body 的時候萤悴,就不再是原始的 markdown 文本了瘾腰,而是渲染過后的 html 文本。注意這里我們給 markdown 渲染函數傳遞了額外的參數 extensions覆履,它是對 markdown 語法拓展蹋盆,這里我們使用了三個拓展,分別是 extra硝全、codehilite栖雾、toc。extra 本身包含很多拓展伟众,而 codehilite 是語法高亮拓展析藕,這為我們后面的實現代碼高亮功能提供基礎,而 toc 則允許我們自動生成目錄凳厢。
來測試一下效果账胧,進入后臺竞慢,這次我們發(fā)布一篇 markdown 語法的測試文章看看,你可以使用以下的 markdown 測試代碼進行測試治泥,也可以自己書寫你喜歡的 markdown 文本梗顺。假設你是 markdown 新手參考一下這些教程,一定學一下车摄,保證你可以在 5 分鐘內掌握常用的語法格式,而以后對你寫作受用無窮仑鸥∷辈ィ可謂充電五分鐘,通話 2 小時眼俊。以下是我學習中的一些參考資料:
# 一級標題
## 二級標題
### 三級標題
- 列表項1
- 列表項2
- 列表項3
> 這是一段引用
| Tables | Are | Cool |
| ------------- |:-------------:| -----:|
| col 3 is | right-aligned | $1600 |
| col 2 is | centered | $12 |
| zebra stripes | are neat | $1 |
?```python
def detail(request, pk):
post = get_object_or_404(Post, pk=pk)
post.body = markdown.markdown(post.body,
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
'markdown.extensions.toc',
])
return render(request, 'blog/detail.html', context={'post': post})
?```
## html safe 標簽的使用意狠。
我們在發(fā)布的文章詳情頁沒有看到預期的效果,而是類似于一堆亂碼一樣的 html 標簽疮胖,這些標簽本應該在瀏覽器顯示它本身的格式环戈,但是 django 出于安全方面的考慮,任何的 html 代碼在 django 的模板中都會被轉義(即輸入原始的 html 文檔代碼澎灸,而不是經瀏覽器渲染后的格式)院塞,為了解除轉義,只需在模板標簽使用 safe 過濾器即可性昭,告訴 django拦止,這段文本是安全的,你什么也不用做糜颠。在模板中找到展示博客文章主體的 {{ post.body }} 部分汹族,為其加上 safe 過濾器,{{ post.body|safe }}其兴,大功告成顶瞒,這下看到預期效果了。

## 代碼高亮
程序員寫博客免不了要插入一些代碼元旬,markdown 的語法使我們容易地書寫代碼塊榴徐,但是目前來說,顯示的代碼塊里的代碼沒有任何顏色法绵,很不美觀箕速,也難以閱讀,要是能夠像我們的編輯器里一樣讓代碼高亮就好了朋譬。雖然我們在渲染時使用了 codehilite 拓展盐茎,但這只是實現代碼高亮的第一步,還需要簡單的幾步才能達到我們的最終目的徙赢。
首先我們需要安裝 Pygments字柠,進入虛擬環(huán)境探越,運行: `pip install Pygments`
搞定了,雖然我們除了安裝了一下 Pygments 什么也沒做窑业,但 Markdown 使用 Pygments 在后臺為我們做了很多事钦幔。如果你打開博客詳情頁,找到一段代碼段常柄,在瀏覽器查看這段代碼段的 html 源代碼鲤氢,可以發(fā)現 Pygments 的工作原理是把代碼切分成一個個單詞,然后為這些單詞添加 css 樣式西潘,不同的詞應用不同的樣式卷玉,這樣就實現了代碼顏色的區(qū)分,即高亮了語法喷市。為此相种,還差最后一步,引入一個樣式文件來給這些被添加了樣式的單詞定義顏色品姓。我比較喜歡 friendly 樣式寝并,當然你也可以選擇自己喜歡的 css 文件下載并引入。
在 blog/css 目錄下新建一個 friendly.css 文件腹备,把[這個里面的內容](https://github.com/zmrenwu/django-blog-tutorial/blob/Step9_markdown-and-code-highlight-supported/blog/static/blog/css/friendly.css)復制進去衬潦,保存文件,然后在 base.html 中把樣式文件文件引入馏谨,記得使用前面介紹過的 {% static %} 模板標簽來引入靜態(tài)文件:
```html
base.html
<link rel="stylesheet" href="{% static 'blog/css/pace.css' %}">
<link rel="stylesheet" href="{% static 'blog/css/custom.css' %}">
+ <link rel="stylesheet" href="{% static 'blog/css/friendly.css' %}">
好了别渔,看看效果,大功告成惧互,終于可以愉快地貼代碼了哎媚。