<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Django Blog | 09 這么簡單!實(shí)現(xiàn)博客markdown輸入和顯示

          共 6508字,需瀏覽 14分鐘

           ·

          2021-11-17 21:16

          ??????關(guān)注我,和老表一起學(xué)Python、云服務(wù)器

          作者:老表
          來源:簡說Python

          大家好,我是老表,這個(gè)系列將會更新我編寫,項(xiàng)目的學(xué)習(xí)筆記,也是后面更新的一個(gè)重點(diǎn),希望個(gè)人博客頁面可以早點(diǎn)和大家見面~歡迎大家點(diǎn)贊、留言支持。

          一、前情回顧

          在前面,我們完成了Django Blog博客發(fā)布功能,但是前面發(fā)布的博客內(nèi)容都是富文本的,沒有任何樣式,輸入框也比較簡陋,這一節(jié)中我們將一起來優(yōu)化博客發(fā)布頁面:給博客添加上markdown輸入和顯示方法。

          Django Blog系列文章

          Django Blog|01 創(chuàng)建環(huán)境和項(xiàng)目

          Django Blog|02 創(chuàng)建admin賬戶&settings.py介紹

          Django Blog|03 創(chuàng)建一個(gè)blog app和Article模型

          Django Blog|04 創(chuàng)建blog視圖和完成MVT框架開發(fā)

          Django Blog|05 修改首頁顯示博客列表

          Django Blog|06 添加博客詳情頁視圖,顯示博客詳情

          Django Blog|07 引入Bootstrap前端框架,優(yōu)化頁面

          Django Blog|08 添加編寫+發(fā)布博客功能

          二、引入django-mdeditor,實(shí)現(xiàn)markdown輸入和顯示

          2.1 基本介紹

          django-mdeditor是一個(gè)開源的Django組件,基于Editor.md的Django的Markdow編輯器插件應(yīng)用程序,你可以理解成一個(gè)用django寫app。

          項(xiàng)目地址:https://github.com/pylixm/django-mdeditor

          2.2 安裝并配置

          首先我們需要安裝django-mdeditor模塊,終端下進(jìn)入項(xiàng)目目錄Project/brief_blog/myblog,然后通過指令進(jìn)入虛擬環(huán)境,然后直接pip install即可安裝。

          pipenv?shell
          pip?install?django-mdeditor

          安裝成功后,需要將django-mdeditor注冊到項(xiàng)目設(shè)置中,打開Project/brief_blog/myblog/myblog/settings.py文件,找到INSTALLED_APPS,之前我們在里面注冊了自己寫的blogapp,現(xiàn)在我們將mdeditor注冊進(jìn)去即可,如下所示,加入一行'mdeditor',即可:

          INSTALLED_APPS?=?[
          ????...
          ????'blog',??#?博客app
          ????'mdeditor',??#?markdown編輯器
          ]

          除此之外,還需要進(jìn)一步添加其他相關(guān)設(shè)置,都添加到settings.py的末尾即可:

          #?設(shè)置框架?django-mdeditor(django3.0+需要設(shè)置)
          X_FRAME_OPTIONS?=?'SAMEORIGIN'

          #?添加MEDIA的相關(guān)配置?圖片相關(guān)文件會在uploads/editor目錄下
          MEDIA_ROOT?=?os.path.join(BASE_DIR,?'uploads')
          MEDIA_URL?=?'/media/'

          #?django-mdeditor?設(shè)置
          MDEDITOR_CONFIGS?=?{
          ????'default':{
          ????????'width':?'90%',??#?Custom?edit?box?width
          ????????'height':?500,??#?Custom?edit?box?height
          ????????'toolbar':?["undo",?"redo",?"|",
          ????????????????????"bold",?"del",?"italic",?"quote",?"ucwords",?"uppercase",?"lowercase",?"|",
          ????????????????????"h1",?"h2",?"h3",?"h5",?"h6",?"|",
          ????????????????????"list-ul",?"list-ol",?"hr",?"|",
          ????????????????????"link",?"reference-link",?"image",?"code",?"preformatted-text",?"code-block",?"table",?"datetime",
          ????????????????????"emoji",?"html-entities",?"pagebreak",?"goto-line",?"|",
          ????????????????????"help",?"info",
          ????????????????????"||",?"preview",?"watch",?"fullscreen"],??#?custom?edit?box?toolbar?
          ????????'upload_image_formats':?["jpg",?"jpeg",?"gif",?"png",?"bmp",?"webp"],??#?image?upload?format?type
          ????????'image_folder':?'editor',??#?圖片保存路徑
          ????????'theme':?'dark',??#?工具欄顯示主題,?dark?/?default
          ????????'preview_theme':?'default',??#?預(yù)覽區(qū)顯示主題,?dark?/?default
          ????????'editor_theme':?'default',??#?編輯區(qū)顯示主題,?pastel-on-dark?/?default
          ????????'toolbar_autofixed':?True,??#?工具欄是否固定在頂部
          ????????'search_replace':?True,??#?是否打開搜索替換?
          ????????'emoji':?True,??#?是否打開表情顯示
          ????????'tex':?True,??#?是否打開?tex?圖表顯示
          ????????'flow_chart':?True,??#?是否打開流程圖顯示
          ????????'sequence':?True,?#?是否打開時(shí)序圖顯示
          ????????'watch':?True,??#?實(shí)時(shí)預(yù)覽
          ????????'lineWrapping':?True,??#?是否換行
          ????????'lineNumbers':?True,??#?是否顯示行數(shù)
          ????????'language':?'zh'??#?語言
          ????}
          ????
          }

          接下來,我們需要到Project/brief_blog/myblog/myblog/urls.py中添加mdeditor路由:

          urlpatterns?=?[
          ????path('admin/',?admin.site.urls),
          ????#?第一個(gè)參數(shù)?路由地址
          ????#?第二個(gè)參數(shù):include添加blog子應(yīng)用路由
          ????path('',?include('blog.urls')),
          ????url(r'mdeditor/',?include('mdeditor.urls'))
          ]

          2.3 模塊設(shè)置

          前面配置好django-mdeditor的基本設(shè)置,接下來我們需要修改Model模型中的內(nèi)容字段為markdown類型,我們打開Project/brief_blog/myblog/blog/models.py,原來content字段為models.TextField類型,現(xiàn)在需要修改為mdeditor.fields.MDTextField

          from?django.contrib.auth.models?import?User
          from?django.urls?import?reverse
          from?mdeditor.fields?import?MDTextField??#?新增

          #?Create?your?models?here.


          class?Article(models.Model):
          ????...??#?和之前一樣
          ????#?文章正文
          ????content?=?MDTextField()??#?TextField修改為MDTextField
          ????...??#?和之前一樣

          改好models內(nèi)容后,我們需要重新遷移、建立新的數(shù)據(jù)映射,更新數(shù)據(jù)表,在終端虛擬環(huán)境中依次執(zhí)行下面語句即可。

          python?manage.py?makemigrations
          python?manage.py?migrate

          注意哈,python manage.py ?xxx的意思是 在python環(huán)境中運(yùn)行manage.py這個(gè)文件,所以你執(zhí)行這個(gè)命令的目錄里必須有manage.py這個(gè)文件,按本系列操作的話,該文件在Project/brief_blog/myblog這個(gè)目錄下。

          2.4 查看效果

          模型也重構(gòu)后,我們就可以直接啟動項(xiàng)目啦~(可以直接vscode 快捷鍵Shift F5啟動,也可以在終端輸入下面指令啟動)

          python?manage.py?runserver

          啟動的項(xiàng)目后,我們通過瀏覽器訪問http://127.0.0.1:8000/admin/,登錄admin后臺,進(jìn)入文章管理頁面,選擇添加文章,就可以看到已經(jīng)支持markdown輸入和實(shí)時(shí)顯示了,nice~

          我已經(jīng)添加過,所以是修改

          但是我們會發(fā)現(xiàn)前端寫博客頁面還是沒有生效,很簡單,我們打開Project/brief_blog/myblog/templates/article_add.html文件,然后添加一行代碼即可:

          ...??#?和之前一樣
          <h1>寫博客h1>
          <form?method="POST">
          ????
          ????{%?csrf_token?%}
          ????{{?form.media?}}??
          ????{{?form.as_p?}}
          ????<input?type="submit"?value="發(fā)布">
          form>
          ...??#?和之前一樣

          2.5 文章詳情頁修改

          完成了寫文章添加markdown功能后,我們會發(fā)現(xiàn)發(fā)布的文章顯示還是按富文本進(jìn)行顯示的,所以我們還需要修改下文章詳情頁,讓其能解析出markdown內(nèi)容的格式,至少就像我們在寫的時(shí)候預(yù)覽里的格式一樣。

          從邏輯上來說,就靠django-mdeditor是肯定能實(shí)現(xiàn)的,預(yù)覽的效果顯示到前端頁面,我們找到相關(guān)方法和渲染的js、html就行。

          從項(xiàng)目的issues中我們可以找到類似的問題,

          https://github.com/pylixm/django-mdeditor/issues/5

          項(xiàng)目作者也有很好的回答,其實(shí)在項(xiàng)目中作者就給我們提供了一個(gè)demo,大家感興趣,也可以去跑一下這個(gè)demo。

          我們按作者提供的show.html格式修改下我們的article_detial.html即可。

          https://github.com/pylixm/django-mdeditor/blob/master/mdeditor_demo_app/templates/show.html

          從上圖我們知道,需要加載靜態(tài)文件,但是這個(gè)文件從哪里來呢?

          有三個(gè)地方你可以拿(xia)到(zai)它,最簡單的直接在公眾號:簡說Python后臺回復(fù):DjangoBlog,你可以獲得目前項(xiàng)目所有源碼,在目錄myblog/static中就有該文件,復(fù)制到自己項(xiàng)目的static目錄下即可;

          其次就是django-mdeditor項(xiàng)目的github中就有這個(gè)文件,直接下載整個(gè)項(xiàng)目后,將mdeditor目錄內(nèi)容復(fù)制到自己項(xiàng)目的static目錄下即可。

          https://github.com/pylixm/django-mdeditor

          最后一種獲取方式就是去你的python環(huán)境包里找,

          #?找到自己虛擬環(huán)境路徑
          pipenv?--venv

          如果你和我一樣用pipenv安裝的虛擬環(huán)境,直接在環(huán)境中輸入上面指令就能知道自己的虛擬環(huán)境安裝目錄,進(jìn)入該目錄,在這個(gè)目錄中你能看到mdeditor文件夾lib/python3.10/site-packages/mdeditor/static,直接復(fù)制到自己項(xiàng)目中的static目錄下即可。

          為啥提供三種方式呢,希望大家多思考,學(xué)習(xí)就是要多思考嘛~

          接下來我們就可以修改詳情頁啦,首先改下Project/brief_blog/myblog/templates/base.html,添加一個(gè)可以拓展link的塊,注意只新增了三行代碼,其他不變。


          {%?load?static?%}???
          html>
          <html?lang="zh-CN">

          <head>
          ??...??
          ??{%?block?link?%}??

          ??{%?endblock?%}??
          ??
          ??<title>
          ????{%?block?title?%}

          ????{%?endblock?%}
          ??...??

          然后我們打開文件Project/brief_blog/myblog/templates/article_detial.html,將文件內(nèi)容替換成下面即可:

          {%?extends?'base.html'?%}

          {%?load?static?%}

          {%?block?link?%}

          <link?href="{%?static?'mdeditor/css/editormd.min.css'?%}"?rel="stylesheet">
          <link?href="{%?static?'mdeditor/css/editormd.preview.css'?%}"?rel="stylesheet">
          {%?endblock?%}

          {%?block?title?%}
          老表愛技術(shù)-{{article.title}}
          {%?endblock?%}

          {%?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>
          ????????<blockquote?style="margin:0?0?24px;background:#eef0f4;border-left:8px?solid?#dddfe4;">
          ????????????{{article.summary}}
          ????????blockquote>
          ????div>
          ????
          ????<div?id="content">
          ????????<textarea>{{article.content}}textarea>
          ????div>
          div>


          <script?src="{%?static?'mdeditor/js/jquery.min.js'?%}">script>
          <script?src="{%?static?'mdeditor/js/editormd.min.js'?%}">script>
          <script?src="{%?static?'mdeditor/js/lib/marked.min.js'?%}">script>
          <script?src="{%?static?'mdeditor/js/lib/prettify.min.js'?%}">script>
          <script?src="{%?static?'mdeditor/js/lib/raphael.min.js'?%}">script>
          <script?src="{%?static?'mdeditor/js/lib/underscore.min.js'?%}">script>
          <script?src="{%?static?'mdeditor/js/lib/sequence-diagram.min.js'?%}">script>
          <script?src="{%?static?'mdeditor/js/lib/flowchart.min.js'?%}">script>
          <script?src="{%?static?'mdeditor/js/lib/jquery.flowchart.min.js'?%}">script>
          <script>
          $(function?()?{
          ????//?js?解析markdown
          ????editormd.markdownToHTML("content",?{
          ????????//htmlDecode??????:?"style,script,iframe",??//?you?can?filter?tags?decode
          ????????emoji???????????:?true,
          ????????taskList????????:?true,
          ????????tex?????????????:?true,??//?默認(rèn)不解析
          ????????flowChart???????:?true,??//?默認(rèn)不解析
          ????????sequenceDiagram?:?true,??//?默認(rèn)不解析
          ????});

          ????$(".reference-link").each(function?(i,obj)?{
          ??????console.log(obj)
          ????})
          })

          script>
          {%?endblock?%}

          完成修改后,我們刷新頁面,會發(fā)現(xiàn),博客詳情頁面的markdown也正常顯示啦~

          歡迎大家點(diǎn)贊、在看、轉(zhuǎn)發(fā)支持,點(diǎn)擊在看,下次可以第一時(shí)間收到公眾號推文~

          本文為付費(fèi)專欄,每周更新1-2篇,利用Django帶大家一起實(shí)現(xiàn)個(gè)人博客,最后也會上線。

          如果是對Django感興趣的初學(xué)者可以購買,如果你對Django已經(jīng)有所了解了,那我不建議你付費(fèi),你可以選擇后面你感興趣的、更深層次的章節(jié)進(jìn)行付費(fèi),如果需要的話。

          閱讀到這里的都是真想學(xué)習(xí)Django的學(xué)習(xí)者,我為大家準(zhǔn)備了一個(gè)Django學(xué)習(xí)交流群(付費(fèi),9.9元/年),加入方式如下:

          給本文留言,然后大家掃下方二維碼,添加我微信,發(fā)送9.9元紅包+留言截圖即可加入:


          掃碼即可加我微信

          老表朋友圈經(jīng)常有贈書/紅包福利活動


          學(xué)習(xí)更多:
          整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了
          點(diǎn)贊”就是對博主最大的支持?
          瀏覽 50
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操屄网久久 | 精品中文字幕视频在线 | 亚洲无码性爱视频在线观看 | 亚洲日本中文字幕在线观看 | 初尝人妻滑进去了 |