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

Django中如何将HTML单元格文本的\r\n解析为换行而非原样显示?

解决Django模板中文本换行问题

先排查核心原因:存储的是转义的\r\n文本还是实际换行符

你的示例文本是b'Hey\r\n\r\n...',如果存储时直接用str(字节串)而非字节串.decode('utf-8'),会导致存入的是包含\r\n字符的文本(比如字符串里是'Hey\\r\\n\\r\\n...'),而非实际的换行符。这种情况下CSS样式(pre-line等)自然无效,因为浏览器只会识别实际的换行符,而不是文本里的\+r+n组合。

第一步:修正存储逻辑

如果是字节串转字符串的问题,存储时要正确解码:

# 错误示例:直接转字符串会保留转义的\r\n
wrong_text = str(b'Hey\r\n\r\nIn regards to your letter sent ...')
# 正确示例:解码为实际带换行的字符串
correct_text = b'Hey\r\n\r\nIn regards to your letter sent ...'.decode('utf-8')
# 存入模型
Letter.objects.create(info=correct_text)

前端显示的两种解决方案

方案1:使用Django内置模板过滤器linebreaksbr

这是最简单的方法,linebreaksbr会自动将文本中的所有换行符(包括\r\n、\n)转换为<br>标签,且默认处理HTML转义,不需要额外操作:

<td>{{ letter.info|linebreaksbr }}</td>

方案2:使用CSS样式(需确保存储的是实际换行符)

如果想用CSS实现,确保存储的是实际换行符后,给单元格设置white-space: pre-line即可(之前无效大概率是因为存储的是转义文本):

<td style="white-space: pre-line;">{{ letter.info }}</td>

pre-line会合并连续的空白符,同时保留换行符,适合普通文本的换行展示。

方案3:自定义模板过滤器(处理遗留数据)

如果已经存了大量带转义\r\n的文本,不想修改数据库,可以自定义过滤器替换转义字符:

  1. 在app下创建templatetags目录,新建custom_filters.py:
from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter(is_safe=True)
def fix_newlines(text):
    # 替换转义的\r\n为<br>
    return mark_safe(text.replace('\\r\\n', '<br>').replace('\\n', '<br>'))
  1. 在模板中加载并使用:
{% load custom_filters %}
<td>{{ letter.info|fix_newlines }}</td>

内容的提问来源于stack exchange,提问作者Julio Martínez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:57:37