Django中POST提交HTML表单时CSV文件无法获取的问题
问题排查与解决
核心原因
你的HTML表单把enctype="multipart/form-data"写在了<input>标签上,这是错误的。这个属性必须添加到<form>标签中,否则浏览器不会以正确的多部分表单格式提交文件,导致Django无法解析文件数据到request.FILES里,只会把文件名放到request.POST中。
修复步骤
1. 修正HTML表单代码
将enctype="multipart/form-data"移到<form>标签上:
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="csvFile" accept=".csv"> <button type="submit">Submit using POST</button> </form>
注:<button>的formmethod="post"可直接移除,因为form已经指定了method="post"。
2. 优化视图代码(可选但推荐)
移除
csrf_exempt,改用Django自带的CSRF保护,在表单中添加{% csrf_token %}标签(需确保模板启用Django模板语法):
修正后的表单:<form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="csvFile" accept=".csv"> <button type="submit">Submit using POST</button> </form>同时删除视图中的
@csrf_exempt装饰器,避免安全风险。添加文件存在性检查,避免直接取
request.FILES['csvFile']触发KeyError:def index(request): context = {} if request.method == 'POST': # 检查文件是否存在 if 'csvFile' in request.FILES: f = request.FILES['csvFile'] print(type(f)) radius_results = pull_radius_zips(f) print('checking this works to this point') else: # 处理未上传文件的情况 context['error'] = '请选择要上传的CSV文件' return render(request, "zip_app/index.html", context)
验证
修改后重新提交表单,文件会被正确解析到request.FILES['csvFile']中,即可正常处理上传的CSV文件。
内容的提问来源于stack exchange,提问作者Louis Nix II
相关产品推荐
相关产品推荐

