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

Django表单提交textarea内容时换行符丢失的原因及解决办法

问题原因
  • 核心原因是使用GET请求提交表单内容:HTTP GET请求的参数拼接在URL Query String中传输,\n属于URL不安全字符,浏览器、代理服务或者Django处理Query String时都会过滤/转义换行符,最终导致后端拿到的内容没有换行。该问题和你移除的WhiteNoiseMiddleware没有关联,无需在中间件层面排查。
  • 若你是通过JavaScript手动拼接参数提交,未对textarea内容做encodeURIComponent编码,也会导致换行符提前丢失。
  • 补充:你模板中给textarea加了无效的value属性,虽然暂时不影响编辑态展示,但属于错误写法,容易引发后续取值异常。
解决方案
  1. 改用POST请求提交(推荐):内容修改操作本身就符合POST请求的语义,POST请求的请求体可以完整保留换行符。你只需要做以下修改:
    • 后端把原来接收GET请求的get方法改为接收POST请求的post方法,取值逻辑改为request.POST.get('notes')
    • 前端表单的提交method改为post,同时带上Django要求的CSRF Token
      改完后就能直接拿到带完整换行的内容,不需要额外编码解码处理。
  2. 修正模板的textarea配置,删除无效的value属性,参考代码如下:
<pre id="{{ entitlement.guid }}_notes">{% if entitlement.notes == '—' or entitlement.notes is None %}—{% else %}{{ entitlement.notes }}{% endif %}</pre>
<textarea id="{{ entitlement.guid }}_notes_new" class="form-control" style="display:none">{{ entitlement.notes }}</textarea>
  1. 如果你有特殊场景必须使用GET提交,需要在前端JS提交前对textarea内容做URL编码:
    // 提交前处理参数
    const notes = document.getElementById('xxx_notes_new').value
    const query = `notes=${encodeURIComponent(notes)}`
    // 后续拼接URL提交
    
    后端拿到值后手动解码恢复换行:
    from urllib.parse import unquote
    value = unquote(request.GET.get('notes', ''))
    

内容的提问来源于stack exchange,提问作者CodeGorilla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:45:04