时间:2024-05-04
牛鹤宁 高小尧
(1.中国电子信息产业集团有限公司第六研究所 北京市 102209 2.北京市南水北调信息中心 北京市 100195)
作为产品检验人员,工作中需要处理大量的文档,如检验记录,检验报告等。而这些记录和报告往往具有统一的模板。基于此需求编写了一款针对产品检验的文档处理系统。近些年,随着 Python 逐渐火热,国内外使用 Python 主流 Web 框架 Django开发的互联网软件也愈发增多。国内比较出名的有豆瓣,海报网,新浪,扇贝网,贝太厨房等[5]。Django 具有简洁、清晰、高效、安全的开发特点,非常适合小型系统的开发。
Django使用forms表单的形式与后台逻辑进行交互,主要完成以下工作:
(1)根据用户输入提交表单。
(2)根据检验申请单和检验大纲导入,提取字段后提交表单。
(3)对提交的数据进行校验,查看数据库中是否有重复数据。
(4)如果出现重复数据,则提示用户是否删除旧数据,若删除,则自动更新成新提交数据,若不删除,则需用户重新输入提交数据。
(5)自动生成检验记录和检验报告。
(6)用户输入数据及导入数据均存入数据库。
(7)条件查询功能,可根据工程令号,产品名称,检验人员继续组合查询。
(8)根据查询列表导出检验台账。
2.1.1 Django ORM(对象数据映射)
Django ORM与数据库映射的关系表现为Django中的一个数据模型(Model)映射一个数据库表。其基本情况是:类(Django.db.models.Model)映射到数据库表,类的属性映射为数据库表字段,类的实例对象则映射为数据行[3]。
ORM封装了SQL语句的功能,通过统一的业务逻辑代码来操作数据库。因此它在语法上与SQL语句有很大差别。
2.1.2 条件查询
数据查询可实现 3 种关键词(工程令号,产品名称,检验人员)的组合查询,选择或录入查询关键词,点击搜索按钮即可将数据库中的信息按条件可视化地展示在数据网格中。查询出的数据自动分页展示,用户可自定义按照时间顺序正序或倒序排列数据,检验结果中的不合格检验项目以红底色显现。由此,用户在远程计算机上即可实现测试数据的网络化查询。
跨表多条件查询分为2步,第一步是跨表查询,第二步是多条件查询。
(1)结果字段跨表查询:
取得跨表查询字段值得形式为“外键+双下划线+关联表的字段名”,如shenqing__projectname,shenqing为数据表Jianyaninfo中的外键,定义为shenqing = models.ForeignKey(JianyanShenqingdan, default="",on_delete=models.CASCADE),通过外键shenqing关联到JianyanShenqingdan中的字段projectname。
查询通过内置函数values()返回一个字典查询列表,列表每一项为字典型、键名为字段名,值为字段值。如下面代码所示,所有需要查询的结果生成一个结果列表:
(2)多条件查询:
在上述结果列表的基础上,增加条件查询,并通过filter函数过滤条件。因为存在多个条件,所以先把所有条件组成一个数据字典,如下代码所示:
字典中只保留不为空的值,根据字典查询结果,如下代码所示:
2.2.1 根据模板生成文档
Python中有丰富的资源库,其中docxtpl就是一个很强大的库,它通过对docx文档模板加载,使用jinja2网页模板开发的语法对其进行修改。Jinja2使用{{}}声明模板中的变量,将docx模板中需要替换的内容使用{{…}}手动标注起来。从导入的word文档中读取值或者从界面写入值,并把这些值传到前台与docx模板中预设的变量名对应起来,使用docxtpl库中的DocTemplate.Render完成模板替换,输出替换后的docx,从而自动生成word文档。
图1:tables模板
图2:导入界面
实现代码如下:
2.2.2 循环生成多个表格
本文除了用到了docxtpl包,还与docx包进行了合并使用,实现循环生成多个表格。通过for循环操作,具体做法如下:在文档中生成另一个文档,定义变量sd = tpl.new_subdoc(),并且给变量增加段,sd.add_paragraph('(' + str(i+1) + ')'),添加表格,table = sd.add_table(rows=rows, cols=0, style='Style3'),并把此变量通过context赋予DocxTemplate类型的变量,然后使用docxtpl库中的DocTemplate.Render完成模板替换,输出替换后的docx,从而自动生成word文档。context的格式为'tables': sd,'tables'即为word模板中的字段。
tables字段在模板的对应位置如图1所示。
实现代码如下:
把上述循环列表sd加入对应字段context中,并通过tpl.render(context)完成模板替换,并保存。
本系统涉及对文件进行导入导出操作的有三处,分别是对检验申请单和检验大纲的导入、检验报告和检验记录的导出、台账导出为Excel文件。
2.3.1 检验申请单和检验大纲的导入
本系统对检验申请单和检验大纲的导入是通过Ajax异步传输的方式,不重新加载页面的情况下,与后端服务器交换数据并更新部分网页内容。导入界面如图2所示,
实现过程如下:
(1)JavaScript:首先创建formdata对象,append()的第二个参数应为文件对象,利用ajax把formdata对象异步传输给后台服务器。上传后,服务器端代码需要使用从查询参数名为file获取文件输入流对象。因为中声明的name=”file”[7]。实现代码此处略。
(2)在dapru应用的view.py中新建视图函Supload(request),通过request.FILES来获取上传文件并保存上传文件到static/files文件夹内。
2.3.2 导出检验记录和检验报告
Django导出文件有三种方式:HttpResponse,StreamingHttp Response,FileResponse。本文主要介绍FileResponse实现方式。FileResponse方法是SteamingHttpResponse的子类,我们只需要将连接地址传给FileResponse函数,就可以实现下载功能,然而这个方法目前尚需完善,因为用户只要获取了文件的链接地址,就可以通过此接口直接访问那些文件。后续开发中会实现文件私有化以及限定文件类型等功能。
实现代码如下:
2.3.3 Excel台账的导出
Excel文件的导出需要使用到三个模块,openpyxl,BytesIO,urlquote。openpyxl库是用来用Python代码操作Excel表的库;BytesIO可以实现在内存中读写bytes;urlquote用来解决导出Excel文件无法使用中文文件名的问题[6]。
主要实现代码如下:
基于Django的Web编程是非常高效的,开发周期大大减少,可以在短时间内完成中小型网站的开发工作。产品检验文档处理系统的实现使得产品检验中的文档编写工作化繁为简,大大节省了工作时间,提高了工作效率。此项目中所有工作均独立完成。项目中的部分功能实现还需进一步完善,页面也需进一步优化,后续将继续完善系统,扩展更多的功能模块。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!