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

