preface

我们知道提交表单有2种方式,一种直接通过submit页面刷新方法来提交,另一种通过ajax异步局部刷新的方法提交,上回我们说了通过ajax来提交文件到后台,现在说说通过submit来提交文件到后台。

看看代码

我们前端使用html语言写的时候,要注意每一个input、select标签需要有name属性,这样我们后端在在获取值的时候,就以name作为key来获取对应value。

首先看看前端html页面

  1. <form id="updatecode" method="post" action="/BatchM/apply_update.html/apply" enctype="multipart/form-data" role="form"> # 申明加密类型,上传文件必须这样。
  2. {% csrf_token %}
  3. <label for="exampleInputEmail1">请选择归属项目</label>
  4. <div>
  5. <select name="flow_project" id="flow_project" class="form-control"> # 都设置了name属性
  6. {% for project in projects %}
  7. <option value="{{ project }}" >{{ project }}</option>
  8. {% endfor %}
  9. </select>
  10. </div>
  11. <label for="exampleInputEmail1">请选择归属应用</label>
  12. <div>
  13. <select id="flow_app" name="flow_app" class="form-control"> # 都设置了name属性
  14. {% for app in apps %}
  15. <option value="{{ app }}" >{{ app }}</option>
  16. {% endfor %}
  17. </select>
  18. </div>
  19. <div class="form-group">
  20. <label for="exampleInputEmail1">哪台服务器需要更新</label>
  21. <!-- <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email"> -->
  22. <input type="text" name="target_host" class="form-control" id="target_host" placeholder="请输入主机ip/域名"> # 都设置了name属性
  23. </div>
  24. <div class="form-group">
  25. <label for="exampleInputFile">附件上传</label>
  26. <input type="file" name="file" id="file_upload"> onclick="FileUpload()">开始上传附件</button> --> # 都设置了name属性
  27. </div>
  28. '''''省略一堆类似的代码'''''
  29. <button type="submit" class="btn btn-success" >提交工单</button>
  30. </form>

我们看看后台,处理这里提交数据的逻辑代码,django作为web框架。

  1. def apply_update_apply(request):
  2. '''
  3. 显示申请更新到页面
  4. :param request:
  5. :return:
  6. '''
  7. if request.method == 'GET':
  8. apps = models.TypeOfApp.objects.all()
  9. projects = models.TypeOfProject.objects.all()
  10. return render(request,'apply_update.html',{'btitle':'申请更新','apps':apps,'projects':projects})
  11. elif request.method == "POST": # 提交数据
  12. file_obj = request.FILES.get('file') # 使用这个 request.FILES.get方法来获取上传文件的句柄
  13. upload_file = None
  14. if file_obj: # 处理附件上传到方法
  15. accessory_dir = settings.accessory_dir # 获取上传路径,在settings配置好的
  16. if not os.path.isdir(accessory_dir): # 判断是否有这个目录,没有就创建
  17. os.mkdir(accessory_dir)
  18. upload_file = "%s/%s" % (accessory_dir, file_obj.name) # 拼接上传路径
  19. with open(upload_file, 'wb') as new_file: # 开始写入文件
  20. for chunk in file_obj.chunks(): # 必须使用chunks方法,因为文件上传采用块上传
  21. new_file.write(chunk)
  22. project_name = request.POST.get('flow_project') # 获取表单里input标签的参数,所有get的key都是name指定的
  23. flow_project = models.TypeOfProject.objects.get(name_of_project=project_name)
  24. app_name=request.POST.get('flow_app')
  25. flow_app = models.TypeOfApp.objects.get(app_name=app_name)
  26. order_id = time.strftime("%Y%m%d%H%M%S", time.localtime())
  27. #print('usernane',request.user.username) #打印用户到名字
  28. #print('email',request.user.email) # 打印用户的邮箱地址
  29. request_set = { # 做成一个字典,方便下一步入库,所有get的值都是在html页面通过input标签的name属性指定的。
  30. 'OrderId':order_id,
  31. 'username': request.user.email, # 通过这个方法获取登陆用户的email
  32. 'flow_project':flow_project,
  33. 'flow_app':flow_app,
  34. 'target_host':request.POST.get('target_host'),
  35. 'code_source':request.POST.get('code_source'),
  36. 'configfile_path':request.POST.get('configfile_path'),
  37. 'configfile_content':request.POST.get('configfile_content'),
  38. 'sql_command':request.POST.get('sql_command'),
  39. 'crond_task':request.POST.get('crondtab_task'),
  40. 'system_env_change':request.POST.get('change_sys_env'),
  41. 'update_of_reason':request.POST.get('Upreason'),
  42. 'accessory_path': upload_file
  43. }
  44. email_issend = core.selfmail(request_set) # 调用发送邮件的功能,发送到指定到地址,成功返回True,失败返回False
  45. request_set['email_issend']= email_issend
  46. data_obj = models.WorkOrderOfUpdate(**request_set)
  47. data_obj.save() # 保存数据
  48. return HttpResponseRedirect('/BatchM/apply_update.html/search/%s'%order_id) # 返回数据给前端

这样我们在前端提交的文本框数据以及文件都可以同时被后台处理啦。。。

4 django系列之HTML通过form标签来同时提交表单内容与上传文件的更多相关文章

  1. php使用jquery Form ajax 提交表单,并上传文件

    在html5中我们通过FormData就可以ajax上传文件数据,不过因为兼容问题.我们选用jquery.form.min.js来进行ajax的表单提交.   一.jquery.form.js下载地址 ...

  2. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  3. $_FILES参数详解及简单<form>表单无刷新上传文件

    $_FILES:经由 HTTP POST 文件上传而提交至脚本的变量,类似于旧数组$HTTP_POST_FILES 数组(依然有效,但反对使用)详细信息可参阅 POST方法上传 $_FILES数组内容 ...

  4. <button>标签也能提交表单问题

    如何避免<button>标签也能提交表单的问题: 只需加上一个属性:type='button'即可:如<button type="button"> < ...

  5. FastAPI框架入门 基本使用, 模版渲染, form表单数据交互, 上传文件, 静态文件配置

    安装 pip install fastapi[all] pip install unicorn 基本使用(不能同时支持,get, post方法等要分开写) from fastapi import Fa ...

  6. SpringMVC 使用Form标签库制作登录表单

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  7. 使用jQuery.form库中ajaxSubmit提交表单时遇到的一些问题

    初入前端,网上找的很多资料都不够详细,导致遇到很多问题,现记录如下: 1.首先引入 <script src="~/Scripts/jquery-1.10.2.js">& ...

  8. Liferay 6.2 改造系列之十九:修改站点设置的表单内容

    在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of sections that will b ...

  9. 实现简单的django上传文件

    本文用django实现上传文件并保存到指定路径下,没有使用forms和models,步骤如下: 1.在模板中使用form表单,因为这个表单使用于上传文件的,所以method属性必须设置为post,而且 ...

随机推荐

  1. Jquery取得iframe中元素的几种方法

    [jquery]获取iframe中的body元素: $("iframe").contents().find("body").html(); [使用jquery操 ...

  2. ArcGIS Engine开发之书签加载

    ArcGIS中书签是保存特定视图范围的快捷方式.使用书签保存关注的视图范围,可在需要时快速定位.查看与浏览.书签功能主要用到IMapBookmarks.ISpatialBookmark和IAOIBoo ...

  3. ArcGIS Engine开发之地图文档保存

    在对地图文档进行修改后,经常需要对其进行保存.地图文档的保存有直接保存和另存为两种方式.这里的地图文档的修改指的是修改地图文档文件记录信息,不是对空间数据的编辑. 1.地图文档保存 具体实现的思路: ...

  4. 海康威视,大华,宇视 的视频监控iOS Demo

    原谅我只提供一个链接,我在这里写了两遍,最后加个链接页面卡死了,下面的demo,最好真机调试.(写博客还是在别的地方写复制到这里比较好!) 一个画面可以做,4个,9个,16个画面原理是一样的,集合到自 ...

  5. couchDB视图

    视图是设计文档的一部分. 视图函数 map函数 Map方法的参数只有一个,就是当前的文档对象.Map方法的实现需要根据文档对象的内容,确定是否要输出结果. 如果需要输出的话,可以通过emit来完成. ...

  6. Sql Server 2016 新功能——内置的 Temporal Tables

    放假之前老大跟我提起了一下2016有个有趣的功能叫 Temporal Table ,今天去看了一下资料整理一下. 这个功能看上去像是临时表,但是其实是系统维护的一个历史记录表.(在某个程度上面比起我们 ...

  7. ubuntu声音系统

    查看声卡:cat /proc/asound/cards 显示所有ALSA的组件:cat /proc/asound/device aplay -l ubuntu使用pulseaudio,是ALSA(先进 ...

  8. C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)

    在开发过程中,经常需要获取电脑的一些属性,如获取硬盘ID/CPU序列号/MAC地址作为来加密字符串. 1.硬盘 在我查看网上一些文档时,发现很多人对硬盘序列号很模糊~ 什么叫硬盘序列号?指的是作为一个 ...

  9. Linux下安装jdk1.7、Apache-tomcat7

    首先说明下我的主机环境:主机:32位win7 虚拟机:VMware Workstation10.0.1 linux:红帽子centos6.4 jdk1.7 Apache-tomcat7 java环境需 ...

  10. Struts2 讲解笔记

    1.第一个Struts2入门案例 1.找jar包 Struts2-core xwork-core ognl javasist freemarker commons-lang commons-io co ...