基于python django的学生选课考勤管理系统
1.系统区分三个角色:学生用户、教师用户、管理员用户
2.学生登录、选课、考勤、打卡等功能
3.教师对课程管理、考勤管理
4.管理员最高权限、对所有数据管理
5.数据可视化展示
6.各个详细功能具体可看截图
本系统主要使用脚本生成了伪数据,存储到mysql中,并且对数据进行各种维度的统计,然后可视化图表展示。
文章目录
以下是一个基于 Python Django 的学生选课考勤管理系统的设计和代码示例。该系统包括以下功能模块:
- 用户管理:分为管理员、教师和学生三种角色。
- 课程管理:管理员可以添加、编辑和删除课程。
- 选课管理:学生可以选课,查看已选课程。
- 考勤管理:教师可以记录学生的考勤情况,学生可以查看自己的考勤记录。
1. 环境准备
确保安装了以下工具:
- Python 3.x
- Django (
pip install django
) - 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 页面,创建用户并分配到相应的组。