基于python django的学生选课考勤管理系统

基于python django的学生选课考勤管理系统

1.系统区分三个角色:学生用户、教师用户、管理员用户
2.学生登录、选课、考勤、打卡等功能
3.教师对课程管理、考勤管理
4.管理员最高权限、对所有数据管理
5.数据可视化展示
6.各个详细功能具体可看截图
本系统主要使用脚本生成了伪数据,存储到mysql中,并且对数据进行各种维度的统计,然后可视化图表展示。
在这里插入图片描述
在这里插入图片描述

以下是一个基于 Python Django 的学生选课考勤管理系统的设计和代码示例。该系统包括以下功能模块:

  1. 用户管理:分为管理员、教师和学生三种角色。
  2. 课程管理:管理员可以添加、编辑和删除课程。
  3. 选课管理:学生可以选课,查看已选课程。
  4. 考勤管理:教师可以记录学生的考勤情况,学生可以查看自己的考勤记录。

1. 环境准备

确保安装了以下工具:

  • Python 3.x
  • Django (pip install django)
  • SQLite(默认数据库)

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7e5c6b3e567f4271a33cdb838724a46e.png

2. 创建 Django 项目和应用

django-admin startproject StudentAttendanceSystem
cd StudentAttendanceSystem
python manage.py startapp attendance

3. 配置 settings.py

StudentAttendanceSystem/settings.py 中添加以下内容:

INSTALLED_APPS = [
    ...
    'attendance',
]

# 数据库配置(默认使用 SQLite)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# 模板路径配置
TEMPLATES = [
    {
        ...
        'DIRS': [BASE_DIR / 'templates'],
        ...
    },
]

在这里插入图片描述

4. 定义模型

attendance/models.py 中定义数据库模型:

from django.db import models
from django.contrib.auth.models import User

class Course(models.Model):
    name = models.CharField(max_length=100)
    teacher = models.ForeignKey(User, on_delete=models.CASCADE, related_name='courses')
    description = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.name

class Enrollment(models.Model):
    student = models.ForeignKey(User, on_delete=models.CASCADE, related_name='enrollments')
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='enrollments')

    def __str__(self):
        return f"{self.student.username} - {self.course.name}"

class Attendance(models.Model):
    enrollment = models.ForeignKey(Enrollment, on_delete=models.CASCADE, related_name='attendances')
    date = models.DateField()
    status = models.BooleanField(default=False)  # True 表示出勤,False 表示缺勤

    def __str__(self):
        return f"{self.enrollment.student.username} - {self.date} - {'Present' if self.status else 'Absent'}"

运行以下命令创建数据库表:

python manage.py makemigrations
python manage.py migrate

5. 创建视图

attendance/views.py 中定义视图:

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Course, Enrollment, Attendance
from django.contrib.auth.models import User

@login_required
def home(request):
    user = request.user
    if user.is_staff:
        courses = Course.objects.filter(teacher=user)
        return render(request, 'admin_home.html', {'courses': courses})
    elif user.groups.filter(name='Teacher').exists():
        courses = Course.objects.filter(teacher=user)
        return render(request, 'teacher_home.html', {'courses': courses})
    else:
        enrollments = Enrollment.objects.filter(student=user)
        return render(request, 'student_home.html', {'enrollments': enrollments})

@login_required
def add_course(request):
    if request.method == 'POST':
        name = request.POST['name']
        description = request.POST['description']
        Course.objects.create(name=name, description=description, teacher=request.user)
        return redirect('home')
    return render(request, 'add_course.html')

@login_required
def enroll_course(request, course_id):
    course = get_object_or_404(Course, id=course_id)
    Enrollment.objects.get_or_create(student=request.user, course=course)
    return redirect('home')

@login_required
def mark_attendance(request, course_id):
    course = get_object_or_404(Course, id=course_id)
    enrollments = Enrollment.objects.filter(course=course)
    if request.method == 'POST':
        for enrollment in enrollments:
            status = request.POST.get(f"status_{enrollment.id}", False)
            Attendance.objects.update_or_create(
                enrollment=enrollment,
                date=request.POST['date'],
                defaults={'status': status}
            )
        return redirect('home')
    return render(request, 'mark_attendance.html', {'course': course, 'enrollments': enrollments})

@login_required
def view_attendance(request):
    enrollments = Enrollment.objects.filter(student=request.user)
    attendances = Attendance.objects.filter(enrollment__in=enrollments)
    return render(request, 'view_attendance.html', {'attendances': attendances})

6. 配置 URL

attendance/urls.py 中定义路由:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('add_course/', views.add_course, name='add_course'),
    path('enroll/<int:course_id>/', views.enroll_course, name='enroll_course'),
    path('mark_attendance/<int:course_id>/', views.mark_attendance, name='mark_attendance'),
    path('view_attendance/', views.view_attendance, name='view_attendance'),
]

在主项目的 urls.py 中包含子应用的路由:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('attendance.urls')),
]

7. 创建模板

templates/ 目录下创建以下 HTML 文件:

admin_home.html
<h1>Admin Home</h1>
<a href="{% url 'add_course' %}">Add Course</a>
<ul>
    {% for course in courses %}
        <li>{{ course.name }} - {{ course.teacher.username }}</li>
    {% endfor %}
</ul>
student_home.html
<h1>Student Home</h1>
<ul>
    {% for enrollment in enrollments %}
        <li>{{ enrollment.course.name }}</li>
    {% endfor %}
</ul>
<a href="{% url 'view_attendance' %}">View Attendance</a>
teacher_home.html
<h1>Teacher Home</h1>
<ul>
    {% for course in courses %}
        <li><a href="{% url 'mark_attendance' course.id %}">{{ course.name }}</a></li>
    {% endfor %}
</ul>
add_course.html
<h1>Add Course</h1>
<form method="post">
    {% csrf_token %}
    <input type="text" name="name" placeholder="Course Name" required>
    <textarea name="description" placeholder="Description"></textarea>
    <button type="submit">Add</button>
</form>
mark_attendance.html
<h1>Mark Attendance for {{ course.name }}</h1>
<form method="post">
    {% csrf_token %}
    <input type="date" name="date" required>
    <ul>
        {% for enrollment in enrollments %}
            <li>
                {{ enrollment.student.username }}
                <input type="checkbox" name="status_{{ enrollment.id }}">
            </li>
        {% endfor %}
    </ul>
    <button type="submit">Submit</button>
</form>
view_attendance.html
<h1>Your Attendance</h1>
<ul>
    {% for attendance in attendances %}
        <li>{{ attendance.date }} - {{ attendance.status|yesno:"Present,Absent" }}</li>
    {% endfor %}
</ul>

8. 运行项目

启动开发服务器:

python manage.py runserver

访问 http://127.0.0.1:8000/ 查看系统。


9. 用户组管理

在 Django Admin 中为用户分配角色(如教师、学生):

python manage.py createsuperuser

登录 Django Admin 页面,创建用户并分配到相应的组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值