Django個人博客搭建5-編寫文章詳情頁面並支持markdown語法

Django個人博客搭建1-創建Django項目和第一個App
Django個人博客搭建2-編寫文章Model模型,View視圖
Django個人博客搭建3-創建superuser並向數據庫中添加數據並改寫視圖
Django個人博客搭建4-配置使用 Bootstrap 4 改寫模板文件
Django個人博客搭建5-編寫文章詳情頁面並支持markdown語法
Django個人博客搭建6-對文章進行增刪查改
Django個人博客搭建7-對用戶登陸註冊等需求的實現
Django個人博客搭建8-優化文章模塊
Django個人博客搭建9-增加文章評論模塊
1. 編寫視圖函數
打開article/views.py增加文章詳情頁函數article_detail():

# 文章詳情
def article_detail(request, id):
   article = ArticlePost.objects.get(id=id)
   context = {'article': article}
   # 載入模板,並返回context對象
   return render(request, 'article/detail.html', context) 

2. 編寫article/urls.py,配置路由地址:

# 引入path
from django.urls import path
from . import views
# 正在部署的應用的名稱
app_name = 'article'
urlpatterns = [
    # path函數將url映射到視圖
    path('article-list/', views.article_list, name='article_list'),
    
    # 新增函數
    path('article-detail/<int:id>/', views.article_detail, name='article_detail'),
]

3.編寫模板article/detail.html

<!-- extends表明此頁面繼承自 base.html 文件 -->
{% extends "base.html" %}
{% load staticfiles %}
<!-- 寫入 base.html 中定義的 title -->
{% block title %}
    文章詳情
{% endblock title %}
<!-- 寫入 base.html 中定義的 content -->
{% block content %}
<!-- 文章詳情 -->
<div class="container">
    <div class="row">
        <!-- 標題及作者 -->
        <h1 class="col-12 mt-4 mb-4">{{ article.title }}</h1>
        <div class="col-12 alert alert-success">作者:{{ article.author }}</div>
        <!-- 文章正文 -->
        <div class="col-12">
            <p>{{ article.body }}</p>
        </div>
    </div>
</div>
{% endblock content %}

然後我們就可以在瀏覽器中輸入 http://127.0.0.1:8000/article/article-detail/1/ 查看第一篇文章了
在這裏插入圖片描述
4.優化網頁入口
改寫header.html,讓用戶可通過導航欄右側的文章鏈接返回首頁:

<!-- 定義導航欄 -->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
  <div class="container">
    <!-- 導航欄商標 -->
    <a class="navbar-brand" href="#">我的博客</a>
    <!-- 導航入口 -->
    <div>
      <ul class="navbar-nav">
        <!-- 條目 -->
        <li class="nav-item">
         <!-- 修改這裏 -->
          <a class="nav-link" href="{% url 'article:article_list' %}">文章</a>
        </li>
      </ul>
    </div>
  </div>
</nav>

這樣點擊文章鏈接就能直接返回首頁
同樣修改閱讀本文的按鈕鏈接:

<!-- extends表明此頁面繼承自 base.html 文件 -->
{% extends "base.html" %}
{% load staticfiles %}
<!-- 寫入 base.html 中定義的 title -->
{% block title %}
    首頁
{% endblock title %}
<!-- 寫入 base.html 中定義的 content -->
{% block content %}
<!-- 定義放置文章標題的div容器 -->
<div class="container">
    <div class="row mt-2">
        {% for article in articles %}
        <!-- 文章內容 -->
        <div class="col-4 mb-4">
        <!-- 卡片容器 -->
            <div class="card h-100">
                <!-- 標題 -->
                <h4 class="card-header">{{ article.title }}</h4>
                <!-- 摘要 -->
                <div class="card-body">
                    <p class="card-text">{{ article.body|slice:'100' }}...</p>
                </div>
                <!-- 註腳 -->
                <div class="card-footer">
                <!-- 修改這裏 -->
                    <a href="{% url 'article:article_detail' article.id %}" class="btn btn-primary">閱讀本文</a>
                </div>
            </div>
        </div>
        {% endfor %}
    </div>
</div>
{% endblock content %}

這樣點擊閱讀本文就能直接進入文章詳情頁了
在這裏插入圖片描述
5.令其支持markdown語法
首先安裝markdown

pip install markdown

然後修改article/views.pyarticle_detail():

# 文章詳情
def article_detail(request, id):
    article = ArticlePost.objects.get(id=id)
    article.body = markdown.markdown(article.body,
                                     extensions=[
                                         # 包含 縮寫、表格等常用擴展
                                         'markdown.extensions.extra',
                                         # 語法高亮擴展
                                         'markdown.extensions.codehilite',
                                     ])
    context = {'article': article}
    # 載入模板,並返回context對象
    return render(request, 'article/detail.html', context)

修改templates/article/detail.html:

<!-- extends表明此頁面繼承自 base.html 文件 -->
{% extends "base.html" %}
{% load staticfiles %}
<!-- 寫入 base.html 中定義的 title -->
{% block title %}
    文章詳情
{% endblock title %}
<!-- 寫入 base.html 中定義的 content -->
{% block content %}
<!-- 文章詳情 -->
    <div class="container">
        <div class="row">
            <h1 class="col-12 mt-4">{{ article.title }}</h1>
            <div class="col-12 alert alert-success">作者: {{ article.author }}</div>
            <div class="col-12">
            <!-- 修改這個部分 -->
                <p>{{ article.body|safe }}</p>
                <!-- 修改這個部分 -->
            </div>
        </div>
    </div>
{% endblock content %}

Django出於安全的考慮,會將輸出的HTML代碼進行轉義,這使得article.body中渲染的HTML文本無法正常顯示。管道符|是Django中過濾器的寫法,而**|safe就類似給article.body貼了一個標籤,表示這一段字符不需要進行轉義**了。
修改完成後,在admin後臺添加markdown語法的文章
#題目

if __name__ == "__main__":
    print("markdown語法測試")

代碼高亮設置
static目錄中新建一個目錄md_css/,用於放置代碼高亮的樣式文件
打開命令行:安裝Pygments

pip install Pygments

進入槓桿船艦的md_css目錄中輸入Pygments指令:

pygmentize -S monokai -f html -a .codehilite > monokai.css

生成命令中的 -a 參數需要與真實頁面中的 CSS Selector 相對應,即**.codehilite這個字段在有些版本中應寫爲.highlight**。如果後面的代碼高亮無效,很可能是這裏出了問題。
完成後可以看見文件夾中多出來一個css文件
在這裏插入圖片描述
之後我們修改base.html 文件

<!-- 載入靜態文件 -->
{% load staticfiles %}
<!DOCTYPE html>
<!-- 網站主語言 -->
<html lang="zh-cn">
<head>
    <!-- 網站採用的字符編碼 -->
    <meta charset="utf-8">
    <!-- 預留網站標題的位置 -->
    <title>{% block title %}{% endblock %}</title>
    <!-- 引入bootstrap的css文件 -->
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <!-- 修改這裏 -->
    <link rel="stylesheet" href="{% static 'md_css/monokai.css' %}">
    <!-- 修改這裏 -->
</head>
<body>
    <!-- 引入導航欄 -->
    {% include 'header.html' %}
    <!-- 預留具體頁面的位置 -->
    {% block content %}{% endblock content %}
    <!-- 引入註腳 -->
    {% include 'footer.html' %}
    <!-- bootstrap.js 依賴 jquery.js 和popper.js,因此在這裏引入 -->
    <script src="{% static 'jquery/jquery-3.3.1.js' %}"></script>
    <script src="{% static 'popper/popper-1.14.4.js' %}"></script>
    <!-- 引入bootstrap的js文件 -->
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
</body>
</html>

保存後我們查看文章詳情:
在這裏插入圖片描述
可以看見支持markdown語法並且代碼已經高亮顯示

Django個人博客搭建1-創建Django項目和第一個App
Django個人博客搭建2-編寫文章Model模型,View視圖
Django個人博客搭建3-創建superuser並向數據庫中添加數據並改寫視圖
Django個人博客搭建4-配置使用 Bootstrap 4 改寫模板文件
Django個人博客搭建5-編寫文章詳情頁面並支持markdown語法
Django個人博客搭建6-對文章進行增刪查改
Django個人博客搭建7-對用戶登陸註冊等需求的實現
Django個人博客搭建8-優化文章模塊
Django個人博客搭建9-增加文章評論模塊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章