在Django Rest Framework中显示HTML表格而非原始数据
有没有办法用CSS样式显示HTML代码,比如表格,而不是用JSON、CSV、文本或者其他格式?我试过把HTML作为字符串发送,但它只是把HTML当作普通文本插入进来。
提前谢谢你!
4 个回答
你有没有安装markdown和django-filter这两个软件包?这两个是我们最近一个项目中,让HTML浏览功能正常工作的必需品。
sudo pip install markdown
sudo pip install django-filter
在你的 settings.py 文件中使用渲染器类。
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.AdminRenderer',
],
}
对于版本为 djangorestframework>=3.7
的更新,默认的视图描述功能需要进行修改。
你可以在这里找到更多信息:https://www.django-rest-framework.org/api-guide/settings/#view_description_function
REST_FRAMEWORK = {
# Module path to a callable which should have a signature (self, html=False)
'VIEW_DESCRIPTION_FUNCTION': 'app_name.view_description.get_view_description',
}
view_description.py
import markdown
from django.utils.encoding import smart_text
from django.utils.html import escape
from django.utils.safestring import mark_safe
from rest_framework.compat import (
HEADERID_EXT_PATH, LEVEL_PARAM, md_filter_add_syntax_highlight
)
from rest_framework.utils import formatting
TABLE_EXTENSION_PATH = 'markdown.extensions.tables'
def _apply_markdown(text):
extensions = [HEADERID_EXT_PATH, TABLE_EXTENSION_PATH]
extension_configs = {
HEADERID_EXT_PATH: {
LEVEL_PARAM: '2'
}
}
md = markdown.Markdown(
extensions=extensions, extension_configs=extension_configs
)
md_filter_add_syntax_highlight(md)
return md.convert(text)
def get_view_description(view_cls, html=False):
description = view_cls.__doc__ or ''
description = formatting.dedent(smart_text(description))
if html:
return mark_safe(_apply_markdown(description))
return description
这是一个老问题,但我刚遇到过,所以想分享我的解决办法,以防其他人也在经历类似的情况。
我最终做的是对 rest_framework.compat.apply_markdown
这个函数进行了一些调整,以启用表格扩展。在我的 settings.py 文件的最后,我添加了以下内容:
# Monkey patch rest_framework's markdown rendering function, to enable the
# tables extension.
import markdown
import rest_framework.compat
def apply_markdown(text):
"""
Simple wrapper around :func:`markdown.markdown` to set the base level
of '#' style headers to <h2>.
"""
extensions = ['markdown.extensions.toc', 'markdown.extensions.tables']
extension_configs = {
'markdown.extensions.toc': {
'baselevel': '2'
}
}
md = markdown.Markdown(
extensions=extensions, extension_configs=extension_configs
)
return md.convert(text)
rest_framework.compat.apply_markdown = apply_markdown
在这个例子中,我使用的是 DRF 3.6.4 和 markdown 2.6.9。在原来的 rest_framework.compat.apply_markdown
函数中,有一些代码会根据 markdown 的版本设置不同的选项,但我在调整中省略了这些内容。
另外要注意的是,默认的表格扩展可能不会给你想要的样式。我最后把 markdown/extensions/tables.py 复制到一个新的模块里,并在 table
元素中添加了 class="table"
。这个修改的源代码可以在 这个链接找到。关于 markdown 中有限的表格语法的更多信息,可以查看 这个讨论。