Qweb遍历Many2many字段添加换行符不生效如何解决?
问题原因
- HTML规范中,普通的换行符
\n不会被浏览器识别为换行标记,默认会将连续空白字符(包括换行、空格、制表符)合并为单个空格显示,所以直接用换行符拼接内容不会出现换行效果。 - 你使用的
t-esc是Odoo QWeb模板的转义输出指令,即使你在拼接内容中加入HTML换行标签<br>,t-esc也会自动将其转义为<br>文本,无法生效为换行。
解决办法
方法1:使用t-raw输出HTML换行标签(适合字段内容可控场景)
直接用<br>作为分隔符拼接,改用t-raw指令输出,该指令不会转义HTML内容:
<span t-raw="'<br>'.join(map(lambda x: x.name, move.myfield_ids))"/>
注意:如果myfield_ids的name字段允许普通用户自由编辑,该方法存在XSS注入风险,更推荐使用方法2。
方法2:QWeb循环渲染(最安全,推荐)
直接遍历Many2many字段的每一项单独输出,每一项后追加换行标签:
<span t-foreach="move.myfield_ids" t-as="field_item"> <span t-esc="field_item.name"/><br/> </span>
该方法使用t-esc输出每个字段值,自动转义特殊字符,无安全风险,代码可读性也更高。
方法3:保留换行符+CSS适配
如果需要保留换行符而非使用HTML标签,可以给外层元素添加white-space: pre-line样式,告诉浏览器识别内容中的换行符:
<span style="white-space: pre-line;" t-esc="' '.join(map(lambda x: x.name, move.myfield_ids))"/>
其中 是换行符的HTML实体写法,也可以直接替换为\n。
内容的提问来源于stack exchange,提问作者Ing
相关产品推荐
相关产品推荐

