使用Django实现HTML文档内指定字符串全局颜色修改的方法
问题根因
Django默认开启了HTML自动转义,你函数返回字符串中的<、>等标签符号会被转义为<、>这类HTML实体字符,因此浏览器不会将其识别为有效HTML标签渲染,只会直接展示明文内容。
解决方案
可根据使用场景选择以下任意一种方式处理:
方案1:函数内标记安全字符串(推荐)
导入Django内置的mark_safe方法,标记返回结果为无需转义的安全HTML内容,修改后的代码如下:from django.utils.safestring import mark_safe def colored(sentence, string, color): if string not in sentence: return mark_safe(sentence) colored_string = f'<span style="color: {color}"> {string} </span>' result = colored_string.join(sentence.split(string)) return mark_safe(result)注意:如果
sentence是用户提交的不可信内容,该方式存在XSS注入风险,需要先对sentence做转义处理后再执行替换逻辑。方案2:模板层关闭变量转义
不需要修改函数代码,直接在模板渲染变量时追加safe过滤器即可:<!-- 示例写法,替换为你实际的变量和参数即可 --> {{ content|colored:"day,#ff0000"|safe }}
可选优化
你当前的实现会替换所有包含目标字符串的片段,比如会把days中的day也错误替换。如果需要精确匹配完整单词,可改用正则加单词边界的方式实现替换,示例如下:
import re from django.utils.safestring import mark_safe def colored(sentence, string, color): pattern = re.compile(rf'\b{re.escape(string)}\b') result = pattern.sub(f'<span style="color: {color}"> {string} </span>', sentence) return mark_safe(result)
内容的提问来源于stack exchange,提问作者Alem
相关产品推荐
相关产品推荐

