1、Python Web开发基础教程(Django版)第9章 Python在线题库本章主要内容:项目设计项目实现数据管理实现试卷导出9.1 项目设计本节主要内容功能分析数据库设计9.1.19.1.1功能分析功能分析Python在线题库主要具有试题管理、试卷模板定制和试卷导出等功能。试题管理:具有试题管理权限的用户可以添加、修改和删除题库中的试题。试卷定制模板:具有试卷定制权限的用户可以设置各种类型的试题在试卷中的数量和分值,后台根据设置随机抽题生成试卷。试卷导出:预览试卷内容、下载试卷Word文件。9.1.29.1.2数据库设计数据库设计 Python在线题库主要包含4个数据表:试题类型表、试题表
2、、试卷模板表和试卷内容表。试题类型表:保存试题类型名称。参照全国计算机等级考试二级Python考试大纲,试题类型包括单项选择题、基本操作题、简单应用题和综合应用题。试题类型表包含试题类型ID和试题类型名称字段。试题表:保存试题。试题表包含试题ID、试题题干、试题选项、试题图片和参考答案等字段。仅单项选择题有试题选项,每小题的选项用JSON字符串表示。试题表与试题类型表之间是多对一关系,一种试题类型对应多道试题。试卷模板表:保存一套试卷的试题设置。试卷模板表包含试卷模板ID、模板名称、制卷时间、单项选择题数量、单项选择题分值、基本操作题数量、基本操作题分值、简单应用题数量、简单应用题分值、综合应
3、用题数量和综合应用题分值等字段。试卷内容表:保存根据试卷模板随机生成的试卷,包含试卷内容ID、试卷名称和试题ID列表。试题ID列表是由随机抽取的试题的ID组成的列表。试卷内容表和试卷模板表之间是多对一关系,一个试卷模板可以随机生成多套试卷。项目中用户管理功能使用默认的Admin站点来实现,相应的模型使用Django默认的用户模型和权限模型。9.2 项目实现本节主要内容创建项目和应用创建模型和数据库注册模型创建添加和修改试题对象模板创建添加和修改试卷内容对象模板实现随机抽取试题9.2.19.2.1创建项目和应用创建项目和应用 将题库项目命名为chapter9,在项目中创建应用ItemPool,在
4、应用中完成项目的相关功能实现。创建项目和应用的具体操作步骤如下。(1)执行下面的命令创建项目chapter9D:django-adminstartprojectchapter9(2)执行下面的命令,在项目中创建应用ItemPool。D:cdchapter9D:chapter9pythonmanage.pystartappItemPool9.2.29.2.2创建模型和数据库创建模型和数据库具体操作步骤如下:(1)用VisualStudio打开项目主文件夹chapter9。(2)修改应用ItemPool中的models.py文件,为项目的试题类型表、试题表、试卷模板表和试卷内容表等定义模型(3)修
5、改项目配置文件settings.py,注册ItemPool应用和中文中间件,设置中文语言、时区和媒体资源目录等。(4)在Windows命令窗口执行命令完成数据库创建。(5)创建Admin站点的超级管理员账户。9.2.39.2.3注册模型注册模型注册模型是实现本例的关键环节,该操作在ItemPool应用的admin.py文件中完成。1修改站点标题修改站点标题本例用自定义标题代替Admin站点的默认标题。#替换站点默认标题 admin.site.site_title=Python在线题库后台管理#定义站点标题(显示在浏览器标题栏)admin.site.site_header=Python在线题库#
6、定义站点页面顶部标题2注册试卷模板模型注册试卷模板模型在Admin站点中,试卷模板模型使用默认管理模板,只需要完成注册即可,注册代码如下。fromdjango.contribimportadmin from.modelsimport*admin.site.register(paperTemplate)#按默认方式注册模型3注册试题类型模型注册试题类型模型注册代码如下。admin.register(itemType)#用下面的自定义类注册试题类型模型 classitemTypeAdmin(admin.ModelAdmin):list_display=id,name#设置在模型数据浏览页面中显示的
7、字段 list_editable=name#允许在模型数据浏览页面中修改字段数据 4注册试题模型注册试题模型 注册代码如下。admin.register(testItem)#注册试题模型 classtestItemAdmin(admin.ModelAdmin):list_display=id,type,question,options,item_pic,answer list_filter=type_name#设置过滤器字段 ordering=type,id#设置排序字段 search_fields=question#设置搜索字段,在页面中显示搜索框 add_form_template=cha
8、nge_testItem.html#设置添加数据表单模板 change_form_template=change_testItem.html#设置修改数据表单模板 fieldsets=(#定义添加和修改页面中的字段及其先后顺序(None,fields:(type,question,options,picture,answer),)5注册试卷内容模型注册试卷内容模型 注册代码如下。admin.register(paperContent)#注册试卷内容模型 classpaperContentAdmin(admin.ModelAdmin):list_display=id,name,content,t
9、emplate ordering=id,name,template add_form_template=paperContent.html change_form_template=paperContent.html fieldsets=(None,fields:(template,name,content),)9.2.49.2.4创建添加和修改试题对象模板创建添加和修改试题对象模板 Admin在添加和修改对象时,通常使用同一个模板。本例中,添加和修改试题对象时,使用change_testItem.html模板9.2.59.2.5创建添加和修改试卷内容对象模板创建添加和修改试卷内容对象模板在添
10、加和修改试卷内容对象时,使用paperContent.html模板9.2.69.2.6实现随机抽取试题实现随机抽取试题实现随机抽取试题的视图代码如下9.3 数据管理本节主要内容试题类型模型管理试题模型管理试卷模板模型管理试卷内容模型管理9.3.19.3.1试题类型模型管理试题类型模型管理9.3.2试题模型管理9.3.3试卷模板模型管理9.3.4试卷内容模型管理9.4 实现试卷导出本节主要内容基本思路定义试卷导出页面模板定义试卷导出相关视图测试试卷导出页面9.4.19.4.1基本思路基本思路 试卷导出实现的基本思路如下:1在试卷导出页面中显示现有的试卷列表。2用户从试卷列表中选择要导出的试卷时,在页面中显示试卷预览内容。试卷预览内容为HTML格式,直接在浏览器中查看。3在生成试卷预览内容的同时,将试卷写入Word文件供用户下载。4获得试卷预览内容后,用户可在页面中请求试卷下载链接。试卷下载为Word文件。5试卷导出页面通过Ajax完成向服务器发起请求,服务器端用Django视图完成处理。9.4.2定义试卷导出页面模板9.4.39.4.3定义试卷导出相关视图定义试卷导出相关视图试卷导出页面需要3个视图:显示试卷导出页面视图 生成试卷预览内容视图 生成下载地址视图。9.4.49.4.4测试试卷导出页面测试试卷导出页面