Django实战之添加markdown编写文章的支持

本文介绍了如何在Django项目中添加Markdown支持,包括使用mistune库处理Markdown文本,修改评论和文章内容的保存及展示方式,以及配置代码高亮。在评论和文章模型中新增字段,处理数据流转过程中的内容格式转换,并在模板中关闭自动转码以正确显示HTML。同时,文章详细页中实现了代码高亮功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

书接https://dongfangyou.blog.csdn.net/article/details/105323313
Markdown 主要依赖于Python第三方库,相关的库有很多
这里我们选择mistune这个库 其他库用起来类似
Markdown的格式,就不过多说了,它已经是现在比较流行的文档格式了
mistune这个库的使用非常的简单,只需要传入写好的Markdown格式文本
就会返回格式化好的HTML代码
首先使用pip3 install mistune

import mistune
html=mistune.markdown("ddddddddddd")

评论支持
我们先来对 评价内容增加Markdown,那么在什么位置出库合适呢,要找到合适的位置,必须聊些数据的传递流程,用户提交评论到评论展示的流程如下,
用户填写评论,提交表单-CommentForm处理表单-验证通过保存数据到instance-instance.save 方法把数据保存到数据库-用户刷新页面,通过comment_block模板自定义标签获取并展示数据
从这个流程中看,我们发现几个点可以用来对内容的格式进行处理,

在form成保存数据之前,我们对数据进行转换,让保存到数据库中的数据是Markdown处理之后的
给Comment模型新增属性content_markdown这个属性的作用是将原内容,进行markdown处理,然后在模板中不使用,comment.content而使用comment.content_markdown
显然,对于博客这种读大于写的系统来说,我更倾向于在写数据时进行转换,因为这种业务下大部分只有一次写的操作。
所以我们在comment/forms.py中修改clean_content方法,在return content 之前增加一句content=mistune.markdown(content)
当然,别忘了在文件最上面加上语句

import mistune

这样重启项目后会遇到问题
因为Django有自动转码功能
所以在comment/block.html代码中的{{comment.content}}位置上下增加autoescape off 的处理,如下

{%autoescape off%}
{{comment.content}}
{%endautoescape%}

此外,侧边栏评论展示模板config/blocks/sidebar_comments.html也要关闭自动转码
文章正文使用Markdown
接着,再来处理文章的内容,其逻辑跟上面一致,我们同样可以在adminform中来处理但是有一个问题,评论的内容目前没有设置可修改功能,但是文章正文我们可能随时都会修改
如果直接把content转为HTML格式然后存储,不便于下次修改,因此,我们需要新增一个字段content_html来代替之前的content
我们正在Post模型中新增如下字段,

content_html=models.TextField(verbose_name="正文html代码",blank=True,editable=False)

这里之所以配置editable=False,是因为这个字段不需要人为处理,编写完代码后,需要进行迁移操作,接着需要重写,save方法,因为在form中处理这种,类型的转换已经不合适了:

class Post(models.Model):
	#省略其他代码
	def save(self,*args,**kwargs):
		self.content_html = mistune.markdown(self.content)
		super().save(*arg,**kwargs)
		

最后,调整模板中展示的部分。修改blog/detail.html中的部分代码为:

{% autoescape off %}
{{post.content_html}}
{% endautoescape %}

再次运行,然后在后台新增markdown格式的内容,如果不知道markdown格式,那么可以搜索一下,找片文章看看
配置代码高亮
在上面的代码中,我们已经完成了对markdown文本处理但是,对于程序员来说,写的内容大部分都会包含代码,默认情况下,markdown,只是帮助我们把代码放到了 标签中,没做特殊处理,因此需要借助另外的工具,
做代码高亮需要依赖前端的库,这里有集中选择,一个是Google出的code-prettfy,另外一个是highlights.js当然,还有其他的选择,不过这里我们选择highlight.js来做,code-prettify用起来大同小异,在此之前,我们需要先来修改blog/base.html模板,在上面增加一个新的block块,用来在子模板中实现特定逻辑,你可以理解为开放一个吃那个的block给子模板填充数据用

{% block extra_head %}
{% endblock%}

然后在blog/detail.html的{% block main %}上面新增如下代码

{% block extra_head %}
<link rel="stylesheet" href="https://cdn.boot.css.com/highlight.js/9.12.0/styles/googlecode.min.css">
<script src="https://cdn.bootcss.com/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
{% endblock %}

我们既可直接使用网上开放的cdn来使用highlight突出显示代码,也可以像,Booststrap那样,
把内容下载到本地,通过我们的静态文件服务来处理,你可以到highlight官网https://highlightjs.org/download/进行定制下载
通常情况下,

##背景##内容
‘’‘
import Django
print(你好)
’‘’

我们markdown处理之后

<h2></h2>
<pre><code></code></pre>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方佑

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值