配置markdown支持文章编写
涉及知识点:
- markdown语法第三方库:mistune
- Form层支持重写字段样式,组件和数据清洗
- 取消django的自动转义:过滤器safe和{% autoescape off %}{% endautoescape %}
- 支持语法高亮的前端库:highlight.js
1.评论内容支持
因为评论内容不会发生修改的情况,所以直接将评论转化为markdown格式存入数据库
- forms.py form层保存数据前进行清洗,使评论转为markdown之后存入数据库
import mistune
from comment.models import Comment
from django import forms
# 如果不考虑样式,仅需定义model和fields即可
class CommentForm(forms.ModelForm):
content = forms.CharField(
label='内容',
max_length=500,
widget=forms.widgets.Textarea(
attrs={'rows': 6, 'cols': 60, 'class': 'form-control'}
)
)
# 定义需要进行数据清洗的字段和规则
def clean_content(self):
content = self.cleaned_data.get('content') # 获取字段内容
if len(content) < 10:
raise forms.ValidationError('评论不可少于10个字')
# 返回markdown格式的评论内容
content = mistune.markdown(content)
return content
class Meta:
model = Comment
fields = ['content',]
2.出于安全考虑,django会对模板中的html标签和js语法等进行自动转义,前端显示的将是html源码,此处进行关闭
{% autoescape off %}
{{ comment.content }} :
{% endautoescape %}
2.文章正文
因正文部分存在修改的状况,我们在model层中新加一个字段content_html用来自动保存处理后的markdown文本(不然再次编辑时拿到的是html源码,无法编辑)
1.Post模型中新增字段,并重写save方法
class Post(models.Model):
# 省略其余代码
content_html = models.TextField(verbose_name='正文html代码', blank=True, editable=False)
# 省略其余代码
# 重写save方法,保存对象时自动赋值content_html
def save(self, *args, **kwargs):
self.content_html = mistune.markdown(self.content)
super().save(*args, **kwargs)
2.模板中关闭django的自动转码功能
3.设置代码高亮:highlight.js
1.在base.html中新增一个block块,用于引入资源
2.detail.html中新增代码
<!-- 导入markdown代码高亮所依赖的库 -->
{% block extra_head %}
<link rel="stylesheet" href="https://cdn.bootcss.com/highlight.js/9.15.8/styles/googlecode.min.css">
<script src="https://cdn.bootcss.com/highlight.js/9.15.7/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
{% endblock %}
参考:《django企业开发实战》