在django-rest-framework中显示HTML表而不是原始数据

时间:2014-05-23 09:56:04

标签: python django django-rest-framework

是否可以显示HTML代码,如css样式的表而不是json / csv / text / whatever? 我试图将html作为字符串发送,但它只是插入html,如原始文本

提前致谢!

3 个答案:

答案 0 :(得分:0)

您是否安装了markdown和django-filter软件包?这些都是让我们的HTML浏览功能适用于最近的项目所必需的。

sudo pip install markdown
sudo pip install django-filter

答案 1 :(得分: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和降价2.6.9。在最初的rest_framework.compat.apply_markdown函数中,有一些代码根据markdown的版本设置了不同的选项,但我在垫片中省略了它。

另请注意,默认表格扩展名可能无法为您提供所需方式的表格。我最终将 markdown / extensions / tables.py 复制到新模块中,并将class="table"添加到table元素。该更改的来源是in a gist。有关markdown中有限表格语法的详细信息,请参阅this thread

答案 2 :(得分: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