如何通过来自 Python 的 id 呈现 django CMS 插件的 HTML

How to render the HTML of a django CMS plugin by id from Python

我的用例是需要从给定的插件中呈现 pdf,尽管该功能也可能用于搜索索引组合等。

在 django CMS 代码库中有 cms.templatetags.render_alias_plugin 哪些代码并不简单,但剥离后它看起来如下:

def render_plugin(plugin: CMSPlugin, request: HttpRequest) -> str:
    plugins = plugin.get_descendants().order_by('placeholder', 'path')
    plugins = [plugin] + list(plugins)
    plugins = downcast_plugins(plugins, request=request)
    plugins = list(plugins)
    plugins[0].parent_id = None
    plugins = build_plugin_tree(plugins)
    renderer = get_toolbar_from_request(request).content_renderer
    html: str = renderer.render_plugin(
        instance=plugins[0],
        context={'request': request},
        editable=False,
    )
    return mark_safe(html)


cms_plugin = CMSPlugin.objects.get(id=cms_plugin_id)
render_plugin(cms_plugin, request)

如果需要,也可以伪造 http 请求,可以找到一个例子 here