Django更新字段时无需重复上传图片的实现需求
Django更新模型时无需重复上传图片的解决方案
问题
更新模型字段时必须重新上传图片文件,期望实现:更新其他文本字段时无需替换已有图片,上传文件选择区域显示当前图片文件名,可按需修改图片。
现有代码
eupdate.html
<input type="text" name="institution" id="institution" placeholder="Institution Name" class="form-control w-50 form-row" value="{{pi.institution}}" required> <input type="text" name="fullname" id="fullname" placeholder="Full Name" class="form-control w-50 form-row mt-1" value="{{pi.fullname}}" required> <input type="text" name="email" id="contact" placeholder="Personal Email " class="form-control w-50 form-row mt-1" value="{{pi.email}}" required> <input type="number" name="contact" id="contact" placeholder="Contact " class="form-control w-50 form-row mt-1" value="{{pi.contact}}" required> <input type="text" name="position" id="position" placeholder="Position " class="form-control w-50 form-row mt-1" value="{{pi.position}}" required> <input class="form-control w-50 form-row mt-1" type="file" id="formFile" name="upload" value="{{pi.uploaddata.url}}" required> <img src={{pi.uploaddata.url}} class="img-fluid img-thumbnail" alt="image" style="width:100px; height: 60px"><br> <input class="form-check-input" type="checkbox" value="" id="invalidCheck" name='checkbox' required> <label class="form-check-label" for="invalidCheck"> Agree to terms and conditions </label> <br> <input class="bg-success text-white mt-1" style="margin-top: 0px;" type="submit" />
views.py
def EuAdmin(request, pk): pi = EmailDb.objects.get(id=pk) if request.method == 'POST': institution = request.POST.get('institution', '') fullname = request.POST.get('fullname', '') email = request.POST.get('email', '') contact = request.POST.get('contact', '') position = request.POST.get('position', '') uploadd = request.FILES.get('upload', '') pi.institution = institution pi.fullname = fullname pi.email = email pi.contact = contact pi.position = position pi.uploaddata = uploadd pi.save() return HttpResponseRedirect("/eadmin") return render(request, 'NEC/eupdate.html', {'pi': pi})
修复步骤
前端修改
- 移除文件输入框的
required属性,允许用户不上传新文件 - 添加元素显示当前已上传的图片文件名(原生file输入无法直接显示已有文件路径)
- 保留图片预览,方便用户查看当前图片
修改后的eupdate.html:
<input type="text" name="institution" id="institution" placeholder="Institution Name" class="form-control w-50 form-row" value="{{pi.institution}}" required> <input type="text" name="fullname" id="fullname" placeholder="Full Name" class="form-control w-50 form-row mt-1" value="{{pi.fullname}}" required> <input type="text" name="email" id="contact" placeholder="Personal Email " class="form-control w-50 form-row mt-1" value="{{pi.email}}" required> <input type="number" name="contact" id="contact" placeholder="Contact " class="form-control w-50 form-row mt-1" value="{{pi.contact}}" required> <input type="text" name="position" id="position" placeholder="Position " class="form-control w-50 form-row mt-1" value="{{pi.position}}" required> <!-- 显示当前文件名 --> {% if pi.uploaddata %} <div class="w-50 form-row mt-1"> <span class="form-control-plaintext">当前图片: {{ pi.uploaddata.name }}</span> </div> {% endif %} <!-- 文件输入框移除required --> <input class="form-control w-50 form-row mt-1" type="file" id="formFile" name="upload"> <img src="{{pi.uploaddata.url}}" class="img-fluid img-thumbnail" alt="image" style="width:100px; height: 60px"><br> <input class="form-check-input" type="checkbox" value="" id="invalidCheck" name='checkbox' required> <label class="form-check-label" for="invalidCheck"> Agree to terms and conditions </label> <br> <input class="bg-success text-white mt-1" style="margin-top: 0px;" type="submit" />
后端修改
核心逻辑:仅当用户上传了新文件时,才更新uploaddata字段,否则保留原有值
修改后的views.py:
def EuAdmin(request, pk): pi = EmailDb.objects.get(id=pk) if request.method == 'POST': # 更新文本字段 pi.institution = request.POST.get('institution', '') pi.fullname = request.POST.get('fullname', '') pi.email = request.POST.get('email', '') pi.contact = request.POST.get('contact', '') pi.position = request.POST.get('position', '') # 仅当有新文件上传时才更新图片字段 uploadd = request.FILES.get('upload') if uploadd: pi.uploaddata = uploadd pi.save() return HttpResponseRedirect("/eadmin") return render(request, 'NEC/eupdate.html', {'pi': pi})
说明
- 前端通过
{% if pi.uploaddata %}判断是否已有图片,显示当前文件名,让用户清楚当前的图片信息 - 后端移除了
request.FILES.get('upload', '')的默认空字符串,改为直接获取,仅当存在时才更新字段,避免覆盖原有图片 - 文件输入框去掉
required,用户可以选择不上传新文件,只修改文本字段
内容的提问来源于stack exchange,提问作者amrit shahi
相关产品推荐
相关产品推荐

