You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django的WYSIWYG编辑器(如django-summernote)中渲染模板变量

在Django的WYSIWYG编辑器(如django-summernote)中渲染模板变量的方案

我之前也碰到过一模一样的问题——用django-summernote编辑的内容里,模板标签比如{{ single.title }}总是原样显示,根本不会渲染成实际值,试了{% autoescape off %}完全没用。后来搞明白原因了:Django默认只会在解析模板文件的时候处理模板标签,而django-summernote保存的是纯HTML字符串,模板解析阶段早就过了,这些标签自然就成了普通文本。

下面是我亲测有效的两种解决方案,你可以根据自己的场景选:

方案一:自定义模板过滤器(推荐,模板层处理)

这个方法可以让你在模板里直接对summernote的内容进行二次渲染,步骤很清晰:

  1. 创建自定义过滤器
    在你的Django应用里新建一个templatetags文件夹(记得加__init__.py空文件),然后创建一个比如summernote_render.py的文件,内容如下:
from django import template
from django.template import Template, Context

register = template.Library()

@register.filter(name='render_summernote')
def render_summernote_content(content, template_context):
    # 确保传入的上下文是Django的Context对象
    if not isinstance(template_context, Context):
        template_context = Context(template_context)
    # 编译summernote内容为模板并渲染
    content_template = Template(content)
    return content_template.render(template_context)
  1. 在模板中使用过滤器
    先加载过滤器,然后把summernote的内容和当前模板的上下文传进去:
{% load summernote_render %}

<!-- 假设你的文章对象是post,summernote字段是content -->
{{ post.content|render_summernote:locals }}

这里locals()会把当前模板里的所有变量都传给过滤器,这样你在summernote里用的任何模板变量都能被渲染。

方案二:视图层提前渲染

如果不想在模板里搞过滤器,也可以在视图里先把summernote的内容渲染好,再传给模板:

from django.template import Template, Context
from django.shortcuts import render
from .models import Post

def post_detail(request, pk):
    post = Post.objects.get(pk=pk)
    # 把需要用到的变量放进上下文
    render_context = Context({
        'single': post,
        'site_name': '我的博客',
        # 其他你需要的变量
    })
    # 编译并渲染summernote内容
    content_template = Template(post.content)
    post.rendered_content = content_template.render(render_context)
    
    return render(request, 'post_detail.html', {'post': post})

然后在模板里直接输出渲染好的内容,记得加|safe避免HTML被转义:

{{ post.rendered_content|safe }}

关键提醒:安全问题!

不管用哪种方法,都要注意XSS风险——因为模板渲染会执行任何模板标签和过滤器,如果允许普通用户编辑summernote内容,恶意用户可能输入危险的模板代码(比如{% load %}或者执行其他逻辑)。所以一定要:

  • 只让信任的用户(比如管理员)编辑这类富文本内容;
  • 用bleach等工具对summernote的输入内容进行过滤,只保留安全的HTML标签和属性;
  • 避免在渲染上下文中传入敏感变量(比如用户的权限信息)。

为什么{% autoescape off %}没用?

简单说,autoescape只是控制Django是否转义HTML内容,而模板变量的解析是在更早的模板编译阶段进行的。summernote的内容是已经存储的字符串,不会被当作模板的一部分再次解析,所以autoescape根本影响不到它。

内容的提问来源于stack exchange,提问作者Vibor Cipan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:02:28