第 8 篇:内容支持 Markdown 语法,接口返回包含解析后的 HTML
在 Django博客教程(第二版) 中,我们给博客内容增加了 Markdown 的支持,博客详情接口应该返回解析后的 HTML 内容。
来回顾一下 Post
模型的代码,Markdown 解析后的 HTML 保存在这几个属性中:
class Post(models.Model):
# ...
@property
def toc(self):
return self.rich_content.get("toc", "")
@property
def body_html(self):
return self.rich_content.get("content", "")
@cached_property
def rich_content(self):
return generate_rich_content(self.body)
rich_content
是 body
Markdown 内容解析后的 HTML 内容,使用了 cached_property
装饰器缓存解析后的结果,以降低多次访问的开销。body_html
属性为解析后的正文内容,toc
属性是从正文标题中提取的目录。
toc
和 body_html
这两个属性的值是我们需要序列化并在接口中返回的,那么可否像之前那样,直接在序列化器 PostRetrieveSerializer
的 Meta.fields
中添加这两个属性就行了呢?
答案是不能。之前说过,模型字段不同类型的值都需要不同的序列化字段对其进行序列化,我们之所以能直接在 Meta.fields
中指定需要序列化的字段而不需要额外的代码是因为这些字段都是直接定义在 django 的模型中的。django-rest-framework 可以根据模型中的字段的定义自动推断该使用何种类型的序列化字段,但对于这里提到的 toc
、body_html
属性,django-rest-framework 就无法推断其值的类型,也就无法自动使用对应的序列化字段对其进行序列化了。不过解决方法很简单,既然 django-rest-framework 无法自动推断,那我们就人工指定该使用何种类型的序列化字段就行了。
这里需要序列化的字段值都是字符串,因此在序列化器中显示地指定需要序列化的字段以及使用的系列化字段类型就可以了:
class PostRetrieveSerializer(serializers.ModelSerializer):
category = CategorySerializer()
author = UserSerializer()
tags = TagSerializer(many=True)
toc = serializers.CharField()
body_html = serializers.CharField()
class Meta:
model = Post
fields = [
"id",
"title",
"body",
"created_time",
"modified_time",
"excerpt",
"views",
"category",
"author",
"tags",
"toc",
"body_html",
]
添加完成后,访问一篇文章的详情接口,就可以看到被序列化并返回的文章目录和正文 HTML 内容了。
关注公众号加入交流群
相关文章
- 马上都2023了,但是CNS级别单细胞文章仍然是使用monocle2
- 使用Mosquitto实现MQTT客服端C语言
- mosquitto移植到ARM
- mosquitto的安装与使用
- QT下载与安装
- 虚拟基站(VRS)
- liunx驱动之字符设备的注册
- 湃兔更新镜像文件的制作与烧写
- 通过busybox制作根文件系统详细过程
- 内核与设备树的编译和烧写
- UBoot的编译与烧写
- Nextcloud 使用教程
- uboot通过NFS挂载ubuntu根文件系统
- 如何在博客园编写博文章
- [NetWork] 数据封装与解封装流程
- 深度学习-LeNet(第一个卷积神经网络)
- Java跨域-Redirect的跨域问题解决
- 十年前,AlexNet就预定了今天的NeurIPS 2022时间检验奖
- 无需新型token mixer就能SOTA:MetaFormer视觉基线模型开源,刷新ImageNet记录
- 推荐一款神仙颜值的Redis客户端工具