Django框架实现在线考试系统的示例代码

本文详细介绍了如何使用Django框架搭建一个在线考试系统,包括项目设计思路、数据库设计、环境配置、模型创建、视图函数、模板渲染、用户登录与权限管理、自动阅卷等功能实现。适合Django初学者和需要开发类似系统的开发者参考。
摘要由CSDN通过智能技术生成

1.Django的简介

Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django
里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下:

层次 职责
模型(Model),即数据存取层 模型(Model),即数据存取层
模板(Template),即表现层 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
视图(View),即业务逻辑层 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

Django里重要的概念有:

  • 路由映射
  • 视图函数
  • 模板渲染
  • Django自带的ORM操作(对象关系映射)

2.项目的设计思路

1.在线考试系统需求如下:
(1)系统登录:验证登录用户的身份,根据用户身份进入不同的页面。
(2)学生管理:供管理员使用,用于维护学生基本信息。
(3)老师管理:供管理员使用,用于维护教师的基本信息。
(4)试题管理:供教师管理,用于维护题库。
(5)组卷:供教师使用,教师可以根据考试科目,从题库中选择一些符合条件的试题,形成一份试卷。为了方便教师组卷,应提供方便的查询功能,使教师能查询不同要求的试题。
(6)在线考试:供学生使用,根据学生的班级和登录时间显示应考科目的试卷内容。试卷完成提交或考试时间到,不再允许学生修改试卷;实现自动评阅,记录学生的考试成绩,并将评阅结果提供给学生。
(7)成绩统计:供教师使用,按照科目、班级等统计学生的考试成绩。
(8)成绩查询:供教师和学生使用,提供不同查询方式,使教师和学生可以按需查询考试成绩。

2.设计思路
(1)确定角色
由需求分析看出,系统有三个基本角色,学生、教师、管理员。

  • 管理员负责后台信息的维护
  • 系统要能实现自动阅卷功能

(2)数据库表的设计
因此,我们至少需要如下几个表:

  • 学生表 student
  • 教师表 teacher
  • 题库表 question(为了方便,题库中都为单项选择题)
  • 试卷表 paper
  • 学生成绩表 grade

设计完表,我们还需要确定 表间的关系 ,是 1对1(1:1),1对多(1:n),还是多对多(n:m) ,这很 重要
,因为后面我们在models.py中创建表时,需要指出表间关系。
显然

  • 学生表和成绩表,1个学生可参加多门考试,会有多个成绩,学生表和成绩表为1:n
  • 教师表和试卷表,1个教师会发布多套试卷,但1套试卷只能由1位教师发布,教师表和试卷表为1:n
  • 试卷表和题库表,1套试卷里包含多道题,题库里的每道题也可出现在多个试卷中,故试卷表和题库表为n:m

表的详细设计如下:(使用MindMaster绘制,有点丑,请忽略,重点写下自己的思考和思路)

表的设计

3.搭建你的开发环境

IDE使用PyCharm(profession版的)
python 3.7, Django 2.1.0
数据库为关系数据库mysql 5.6

为了更快的下载python模块,需要切换镜像源,我使用阿里云的镜像(还有很多镜像源),方法如下:
在 C:\Users\XXX(你的账户) 下建立 pip文件夹,在pip下建立 pip.ini文件,输入以下代码:


    [global]
    index-url = http://mirrors.aliyun.com/pypi/simple/
    [install]
    trusted-host=mirrors.aliyun.com

安装所需模块

Django的安装: pip install django==2.1.0(请指定版本号,最新的Django需要数据库mysql5.6以上),你可以使用pip
list来查看版本,使用 pip uninstall django 来卸载django模块

安装mysql数据库驱动 pip install pymysql
配置好后建立项目

(1) 在PyCharm中建立Django项目

建立项目

图1 建立项目

此处没有使用虚拟环境,你也可以选择 “New environment using”选项来创建一个虚拟环境(可以避免多个项目使用不同模块的版本时发生冲突)

(2)创建app
Tools->Run manage.py task

在这里插入图片描述

在控制台输入 startapp student,创建一个student app,

在这里插入图片描述

之后需要将student
app配置在项目的settings.py中,由于我的前台需要用到css、BootStrap、一些图片等文件,所以我在项目下建立static文件夹,并将其路径配置在settings.py文件中。整体目录如下:

在这里插入图片描述

(3)settings.py文件的配置
配置settings.py文件配置如下,请看注释


    INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'student',#将建立的app名称加入Installed_APPs中
    ]
    
    MIDDLEWARE = [
      'django.middleware.security.SecurityMiddleware',
      'django.contrib.sessions.middleware.SessionMiddleware',
      'django.middleware.common.CommonMiddleware',
      # 'django.middleware.csrf.CsrfViewMiddleware',
      'django.contrib.auth.middleware.AuthenticationMiddleware',
      'django.contrib.messages.middleware.MessageMiddleware',
      'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = 'onlineExam.urls'
    
    TEMPLATES = [
      {
   
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
   
          'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
          ],
        },
      },
    ]
    
    WSGI_APPLICATION = 'onlineExam.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.1/ref/settings/#databases
    
    #配置mysql数据库
    DATABASES = {
   
      'default': {
   
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'exam',#使用数据库的名称
        'USER':'root',#用户名
        'PASSWORD':'123456',#密码
        'HOST':'127.0.0.1',#地址
        'PORT':'3306'#端口号
      }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
      {
   
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
      },
      {
   
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
      },
      {
   
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
      },
      {
   
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
      },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.1/topics/i18n/
    
    #修改语言为中文
    LANGUAGE_CODE = 'zh-hans'
    
    #修改时区为shanghai
    TIME_ZONE = 'Asia/Shanghai'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.1/howto/static-files/
    
    #添加static文件夹
    STATIC_URL = '/static/'
    STATICFILES_DIRS=[
      os.path.join(BASE_DIR,'static'),
    ]

需要注意的地方有:

  • NSTALLED_APPS 添加了新建的student app
  • DATABASES 配置你的数据库参数
  • MIDDLEWARE 注释掉了 # 'django.middleware.csrf.CsrfViewMiddleware’这一行
  • STATICFILES_DIRS 添加新建的static文件夹

(4)在__init___.py文件添加mysql的驱动模块


    import pymysql
    pymysql.install_as_MySQLdb()

4.分模块详细设计

(1)建表
在student下的models.py中建表


    from django.db import models
    
    # Create your models here.
    
    # 为性别,学院 指定备选字段
    SEX=(
      ('男','男'),
      ('女','女'),
    )
    DEPT=(
      ('计算机与通信学院','计算机与通信学院'),
      ('电气与自动化学院','电气与自动化学院'),
      ('外国语学院','外国语学院'),
      ('理学院','理学院'),
    )
    
    class Student(models.Model):
      id=models.CharField('学号',max_length=20,primary_key=True)
      name=models.CharField('姓名',max_length=20)
      sex=models.CharField('性别',max_length=4,choices=SEX,default='男')
      dept=models.CharField('学院',max_length=20,choices=DEPT,default=None)
      major=models.CharField('专业',max_length=20,default=None)
      password=models.CharField('密码',max_length=20,default='111')
      email=models.EmailField('邮箱',default=None)
      birth=models.DateField('出生日期')
    
      class Meta:
        db_table='student'
        verbose_name='学生'
        verbose_name_plural=verbose_name
      def __str__(self):
        return self.id;
    
    class Teacher(models.Model):
      id=models.CharField("教工号",max_length=20,primary_key=True)
      name=models.CharField('姓名',max_length=20)
      sex=models.CharField('性别',max_length=4,choices=SEX,default='男')
      dept=models.CharField('学院',max_length=20,choices=DEPT,default=None)
      email=models.EmailField('邮箱',default=None)
      password=models.CharField('密码',max_length=20,default='000000')
      birth=models.DateField('出生日期')
    
      class Meta:
        db_table='teacher'
        verbose_name='教师'
        verbose_name_plural=verbose_name
      def __str__(self):
        return self.name;
    
    class Question(models.Model):
    
      ANSWER=(
        ('A','A'),
        ('B','B'),
        ('C','C'),
        ('D','D'),
      )
      LEVEL={
   
        ('1','easy'),
        ('2','general'),
        ('3','difficult'),
      }
      id = models.AutoField(primary_key=True)
      subject = models.CharField('科目', max_length=20)
      title = models.TextField('题目')
      optionA=models.CharField('A选项',max_length=30)
      optionB=models.CharField('B选项',max_length=30)
      optionC=models.CharField('C选项',max_length=30)
      optionD=models.CharField('D选项',max_length=30)
      answer=models.CharField('答案',max_length=10,choices=ANSWER)
      level=models.CharField('等级',max_length=10,choices=LEVEL)
      score=models.IntegerField('分数',default=1)
    
      class Meta:
        db_table='question'
        verbose_name='单项选择题库'
        verbose_name_plural=verbose_name
      def __str__(self):
        return '<%s:%s>'%(self.subject,self.title);
    
    class Paper(models.Model):
      #题号pid 和题库为多对多的关系
      pid=models.ManyToManyField(Question)#多对多
      tid=models.ForeignKey(Teacher,on_delete=models.CASCADE)#添加外键
      subject=models.CharField('科目',max_length=20,default='')
      major=models.CharField('考卷适用专业',max_length=20)
      examtime=models.DateTimeField
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值