在Django Rest Framework中显示HTML表格而非原始数据

2 投票
4 回答
1081 浏览
提问于 2025-04-18 07:23

有没有办法用CSS样式显示HTML代码,比如表格,而不是用JSON、CSV、文本或者其他格式?我试过把HTML作为字符串发送,但它只是把HTML当作普通文本插入进来。

提前谢谢你!

4 个回答

-1

你有没有安装markdown和django-filter这两个软件包?这两个是我们最近一个项目中,让HTML浏览功能正常工作的必需品。

sudo pip install markdown
sudo pip install django-filter
0

在你的 settings.py 文件中使用渲染器类。

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.AdminRenderer',
    ],
}
0

对于版本为 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
0

这是一个老问题,但我刚遇到过,所以想分享我的解决办法,以防其他人也在经历类似的情况。

我最终做的是对 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 中有限的表格语法的更多信息,可以查看 这个讨论

撰写回答