0
点赞
收藏
分享

微信扫一扫

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

whiteMu 2022-04-06 阅读 70


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>



举报

相关推荐

0 条评论