Django博客--5.让博客支持 Markdown 语法和代码高亮

文章目录

    • 0.前言
    • 1.安装 Python Markdown
    • 2.在 detail 视图中解析 Markdown
    • 3.safe 标签
    • 4.代码高亮
    • 5.效果展示

0.前言

Markdown 是一种 HTML 文本标记语言,只要遵循它约定的语法格式,Markdown 的解析工具就能够把 Markdown 文档转换为标准的 HTML 文档,从而使文章呈现更加丰富的格式,例如标题、列表、代码块等等 HTML 元素。

1.安装 Python Markdown

将 Markdown 格式的文本解析成标准的 HTML 文档是一个复杂的工程,好在已有好心人帮我们完成了这些工作,直接拿来使用即可。首先安装 Markdown,这是一个 Python 第三方库,在项目根目录下运行命令:
pipenv install markdown

2.在 detail 视图中解析 Markdown

将 Markdown 格式的文本解析成 HTML 文本非常简单,只需调用这个库的 markdown 方法。我们书写的博客文章内容存在 Post 的 body 属性里,回到我们的详情页视图函数,对 post 的 body 的值做一下解析,把 Markdown 文本转为 HTML 文本再传递给模板:

文件位置:blog/views.py

import markdown
from django.shortcuts import get_object_or_404, renderfrom .models import Postdef 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 则允许自动生成目录。

Markdown——入门指南:戳这里
Markdown 语法说明:戳这里

3.safe 标签

如果此时运行服务器,在发布的文章详情页会出现类似于一堆乱码一样的 HTML 标签,这些标签本应该在浏览器显示它自身的格式,但是 django 出于安全方面的考虑,任何的 HTML 代码在 django 的模板中都会被转义(即显示原始的 HTML 代码,而不是经浏览器渲染后的格式)。

为了解除转义,只需在模板变量后使用 safe 过滤器即可,告诉 django,这段文本是安全的,你什么也不用做。在模板中找到展示博客文章内容的 {{ post.body }} 部分,为其加上 safe 过滤器:{{ post.body|safe }}
在这里插入图片描述

4.代码高亮

代码高亮我们借助 js 插件来实现,其原理就是 js 解析整个 html 页面,然后找到代码块元素,为代码块中的元素添加样式。我们使用的插件叫做 highlight.js 和 highlightjs-line-numbers.js,前者提供基础的代码高亮,后者为代码块添加行号。

首先在 base.html 的 head 标签里引入代码高亮的样式,有多种样式供你选择,这里我们选择 GitHub 主题的样式。样式文件直接通过 CDN 引入,同时在 style 标签里自定义了一点元素样式,使得代码块的显示效果更加完美。

<head>...<link href="https://cdn.bootcss.com/highlight.js/9.15.8/styles/github.min.css" rel="stylesheet"><style>.codehilite {padding: 0;}/* for block of numbers */.hljs-ln-numbers {-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;text-align: center;color: #ccc;border-right: 1px solid #CCC;vertical-align: top;padding-right: 5px;}.hljs-ln-n {width: 30px;}/* for block of code */.hljs-ln .hljs-ln-code {padding-left: 10px;white-space: pre;}</style>
</head>

然后是引入 js 文件,因为应该等整个页面加载完,插件再去解析代码块,所以把 js 文件的引入放在 body 底部:

<body><script src="https://cdn.bootcss.com/highlight.js/9.15.8/highlight.min.js"></script><script src="https://cdn.bootcss.com/highlightjs-line-numbers.js/2.7.0/highlightjs-line-numbers.min.js"></script><script>hljs.initHighlightingOnLoad();hljs.initLineNumbersOnLoad();</script>
</body>

5.效果展示

在后台添加Markdown格式文章,如下:
在这里插入图片描述
运行服务器,效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Diango博客--6.Markdown 文章自动生成目录

文章目录0.思路引导1.在文中插入目录2.在页面的任何地方插入目录3.美化标题的锚点 URL0.思路引导 Markdown 在解析内容的同时还可以自动提取整个内容的目录结构&#xff0c;本文内容将从以下几个方面展开&#xff1a; 1&#xff09;在文中插入目录&#xff1b; 2&#xff09;在…

Java中对象和引用的理解

2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念&#xff0c;为了加深下对此的理解和认识&#xff0c;特地整理一下相关的知识点&#xff0c;通过具体实例从两者的概念和区别两方面去更形象的认识理解&#xff0c;再去记忆。12一、对…

android怎样封装,如何封装属于自己的博客网站安卓APP 源码家园

说实话我今天在写这个文章的时候是我使用易语言(E4A\易安卓)的第一天&#xff0c;我也是易小白&#xff0c;但是的确可以用&#xff01;我为什么写这个文章呢&#xff1f;因为之前我也想封装自己的网站&#xff0c;然后去网上找的在线封装生成APP&#xff0c;果然能封装好了&am…

Diango博客--7.自动生成文章摘要

文章目录0.思路引导1.方法一&#xff1a;覆写 save 方法2.方法二&#xff1a;使用 truncatechars 模板过滤器0.思路引导 博客文章的模型有一个 excerpt 字段&#xff0c;这个字段用于存储文章的摘要。 若在 django admin 后台手动为文章输入摘要&#xff0c;每次手动输入摘要…

特斯拉股价暴跌,疯狂烧钱是否真的能够带来高额回报?

“疯狂烧钱”并不能成为公司持续亏损的理由&#xff0c;反而可能成为公司升级转型的关键所在。 上周三&#xff0c;特斯拉发布第四季度财报&#xff0c;其后特斯拉CEO马斯克在电话会议上表示&#xff0c;特斯拉亏损收窄&#xff0c;营收同比增长88%&#xff0c;但与此同时其首…

Diango博客--8.解锁博客侧栏

文章目录0.思路引导1.[最新文章] 模板标签2.[归档] 模板标签3.[分类] 模板标签4.[标签云] 模板标签5.使用自定义的模板标签0.思路引导 博客侧边栏有四项内容&#xff1a;最新文章、归档、分类和标签云&#xff0c;效果展示如下&#xff1a; 这些内容相对比较固定和独立&…

十五、详述 IntelliJ IDEA 插件的安装及使用方法

正文 首先&#xff0c;进入插件安装界面&#xff1a; Mac&#xff1a;IntelliJ IDEA -> Preferences -> Plugins;Windows&#xff1a;File -> Settings -> Plugins.标注 1&#xff1a;显示 IntelliJ IDEA 的插件分类&#xff0c; All plugins&#xff1a;显示 Inte…

面向数据流的设计方法

面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。 在软件工程的需求分析阶段&#xff0c;信息流是一个关键考虑。通常用数据流图描绘信息在系统中加工和流动的 情况。面向数据流的设计方法定义了一些不同的“映射”&#xff0c;利用这些映射可以把数据流图…

AI研究的盲点:无解的神经网络内在逻辑

论人工神经网络内在逻辑的研究历史及现状。 伴随着大数据&#xff0c;人工智能&#xff08;AI&#xff09;在沉寂了多年之后&#xff0c;又迎来了新的高潮。在这场涉及大部分科学的革命中&#xff0c;人工神经网络释放了人工智能&#xff08;AI&#xff09;。但科学家们发现&a…

Diango博客--9.归档、分类和标签页

文章目录0.思路引导1.回顾2.归档页面3.分类页面4.标签页面0.思路引导 侧边栏已经正确地显示了最新文章列表、归档、分类、标签等信息&#xff0c;现在来完善归档、分类和标签功能。 当用户点击归档下的某个日期、分类栏目下的某个分类或者标签栏目下的某个标签时&#xff0c;…

android studio1.2.6,1.2.2 使用Android Studio开发Android APP | 菜鸟教程

写在前面本节将介绍如何使用Android Studio开发Android APP&#xff0c;和前面Eclipse ADT SDK搭建Android开发环境一样&#xff0c;本节也只是介绍一些基本东西&#xff0c;深入的&#xff0c;比如快捷键&#xff0c;小技巧等会再另一篇文章中详细地介绍&#xff01;1.下载A…

UPS开始尝试“货车+无人机”的投递方式,不必再担心快递员离职了

继亚马逊“空中仓库”&#xff0c;无人机送货再现新形式。 作为世界上最大的快递承运商与包裹递送公司&#xff0c;UPS当然也没有放过“送货无人机”这一新颖业务。与亚马逊推出“空中仓库”的理念类似&#xff0c;UPS并没有选择让无人机从仓库直接起飞&#xff0c;而是将之与…

Diango博客--10.交流的桥梁“评论功能”

文章目录0.思路引导1.创建"评论"应用2.设计"评论"的数据库模型3.注册"评论"模型到 admin4.设计“评论”表单5.展示评论表单6.“评论”视图函数7.绑定 URL8.向读者发送是否“评论”成功的状态9.详情页底部显示“评论”内容0.思路引导 本文将创建…

python与android交互,Android客户端与Python服务器端的简单通信

最近在做一个APP&#xff0c;需要与服务器通信&#xff0c;一点一点的尝试&#xff0c;记录一下。本文使用了OkHttp和Flask框架。Android客户端&#xff1a;实现功能输入完点击OK按钮后会toast成功的信息。Python服务端&#xff1a;各部分代码如下&#xff1a;activity_main.xm…

云栖科技评论第48期:前沿科技对世界的改造 我们这代人只完成了1%

1、数字经济版图呈中美双分趋势 日本IT行业为前景担忧 数字经济版图呈中美双分趋势 日本IT行业为前景担忧 【新闻摘要】《日本经济新闻》日前刊文称&#xff0c;数字经济的势力版图呈现中国和美国两强双分的趋势明显&#xff0c;这意味着日本可能不得不使用中美的技术&#xff…

CentOS下添加Root权限用户‘超级用户’方法(xxx is not in the sudoers file.This incident will be reported.的解决方法)

文章目录1.添加普通用户2.添加sudo文件的写权限3.编辑sudoers文件4.撤销sudoers文件写权限1.添加普通用户 [rootserver ~]# useradd fxd //添加一个名为fxd的用户 [rootserver ~]# passwd fxd //修改密码 Changing password for user chenjiafa. New UNIX password: //在这里输…

android打印intent flag,Android flag详解

Android flag详解Android flag详解一.Flag标志位在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志&#xff0c;增加标志或者去除标志。如&#xff1a;二.addFlags (int flags)和setFlags (int flags)区别Public Intent addFlags (int flags)增加额外…

开启市场新格局 且看新华三计算与存储新品发布会

全球领先的新IT解决方案领导者新华三将于8月31日在北京钓鱼台国宾馆举办“新IT 新动能 新格局 新华三下一代计算与存储发布会”&#xff0c;重磅发布服务器和存储的全线新品。 2017年初&#xff0c;新华三集团正式推出了“应用驱动 云领未来”的新IT战略。在这一战略指引下&…

龟兔赛跑问题

题目 乌龟与兔子进行赛跑&#xff0c;跑场是一个矩型跑道&#xff0c;跑道边可以随地进行休息。乌龟每分钟可以前进3米&#xff0c;兔子每分钟前进9米&#xff1b;兔子嫌乌龟跑得慢&#xff0c;觉得肯定能跑赢乌龟&#xff0c;于是&#xff0c;每跑10分钟回头看一下乌龟&#x…

Unity4.6证书激活问题

第一次运行的激活问题安装好Unity4.6之后首次启动会自动连网&#xff0c;但是会出现error loading page错误&#xff0c;SSL peer certificate or SSH remote key was not OK。如下图所示&#xff1a; 点OK就退出了。再启动一遍也是一样的。 这时可以先暂时断一下网&#xff0c…