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

Django-summernote可正常使用,但渲染内容时显示HTML标签求助

嘿,我来帮你搞定这个Django-summernote渲染HTML标签的问题!其实核心原因是Django默认会自动转义HTML内容来防范XSS攻击,所以你编辑的富文本内容里的标签会被当成普通文本显示。下面是几个实用的解决思路:

1. 模板中直接使用safe过滤器

这是最快捷的方式——在渲染字段的时候加上|safe过滤器,告诉Django这段内容是安全的,不需要转义HTML标签:

{{ your_model_instance.content|safe }}

举个例子,如果你的模型是Article,字段是body,那模板里就写{{ article.body|safe }},这样summernote编辑的加粗、换行、图片等格式都会正常渲染出来。

2. 在模型层用mark_safe封装内容

如果这个字段需要在多个模板里复用,不想每次都写|safe,可以给模型加一个属性方法,用mark_safe处理内容:

from django.db import models
from django.utils.safestring import mark_safe

class Article(models.Model):
    content = models.TextField()

    @property
    def safe_content(self):
        return mark_safe(self.content)

之后在模板里直接调用这个属性就行:{{ article.safe_content }},效果和加safe过滤器一样。

3. 检查summernote的输出配置

偶尔也可能是summernote本身的输出设置出了问题,比如不小心开启了纯文本模式。检查你的表单配置,确保summernote是输出HTML格式:

from django import forms
from django_summernote.widgets import SummernoteWidget
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['content']
        widgets = {
            'content': SummernoteWidget(attrs={'summernote': {'width': '100%', 'height': '400px'}})
        }

默认情况下summernote会输出完整的HTML,但如果自定义了配置,比如设置了styleWithSpan: false这类选项,也可能影响输出,确保配置是正常的。

4. 用DRF时注意序列化器处理

如果是用Django REST Framework返回数据给前端,要确保序列化器不会转义HTML。可以用HTMLField来序列化字段:

from rest_framework import serializers
from rest_framework.fields import HTMLField
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    content = HTMLField()

    class Meta:
        model = Article
        fields = ['content']

这样返回的JSON里的content就是未转义的HTML,前端直接渲染就能显示正确格式。

⚠️ 小提醒:虽然safe和mark_safe能解决显示问题,但一定要注意XSS安全!Django-summernote默认会过滤掉<script>、<iframe>这类危险标签,但如果你自定义了编辑器的允许标签,一定要确保过滤规则足够严格,避免恶意代码注入。

内容的提问来源于stack exchange,提问作者Hüseyin Kara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:15:23