Django表单提交textarea内容时换行符丢失的原因及解决办法
问题原因
- 核心原因是使用GET请求提交表单内容:HTTP GET请求的参数拼接在URL Query String中传输,
\n属于URL不安全字符,浏览器、代理服务或者Django处理Query String时都会过滤/转义换行符,最终导致后端拿到的内容没有换行。该问题和你移除的WhiteNoiseMiddleware没有关联,无需在中间件层面排查。 - 若你是通过JavaScript手动拼接参数提交,未对textarea内容做
encodeURIComponent编码,也会导致换行符提前丢失。 - 补充:你模板中给textarea加了无效的
value属性,虽然暂时不影响编辑态展示,但属于错误写法,容易引发后续取值异常。
解决方案
- 改用POST请求提交(推荐):内容修改操作本身就符合POST请求的语义,POST请求的请求体可以完整保留换行符。你只需要做以下修改:
- 后端把原来接收GET请求的
get方法改为接收POST请求的post方法,取值逻辑改为request.POST.get('notes') - 前端表单的提交method改为
post,同时带上Django要求的CSRF Token
改完后就能直接拿到带完整换行的内容,不需要额外编码解码处理。
- 后端把原来接收GET请求的
- 修正模板的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>
- 如果你有特殊场景必须使用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
相关产品推荐
相关产品推荐

