书接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>