You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中实现学生按班级划分并关联对应课程?

实现LMS课程与班级-学生关联的方案

一、核心模型设计

先从数据库模型入手,这是整个功能的基础。我们扩展Django自带的User模型区分角色,再建立课程、班级、学生的关联:

# models.py
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    # 区分用户角色:教师/学生
    ROLE_CHOICES = (
        ('teacher', '教师'),
        ('student', '学生'),
    )
    role = models.CharField(max_length=10, choices=ROLE_CHOICES, default='student')

class Course(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, limit_choices_to={'role': 'teacher'})
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

class Class(models.Model):
    # 班级与课程一对一绑定(每个班级对应专属课程)
    course = models.OneToOneField(Course, on_delete=models.CASCADE)
    class_name = models.CharField(max_length=100)

    def __str__(self):
        return f"{self.class_name} - {self.course.title}"

class StudentProfile(models.Model):
    # 学生关联到班级(每个学生属于一个班级)
    user = models.OneToOneField(User, on_delete=models.CASCADE, limit_choices_to={'role': 'student'})
    enrolled_class = models.ForeignKey(Class, on_delete=models.CASCADE, related_name='students')

    def __str__(self):
        return f"{self.user.username} - {self.enrolled_class.class_name}"

二、数据库迁移

模型定义完成后,执行迁移命令创建数据表:

python manage.py makemigrations
python manage.py migrate

三、教师创建课程与班级的视图实现

编写视图让教师能创建课程,并绑定对应的班级:

# views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import Course, Class
from .forms import CourseForm, ClassForm

@login_required
def create_course(request):
    if request.user.role != 'teacher':
        return redirect('home')
    
    if request.method == 'POST':
        course_form = CourseForm(request.POST)
        class_form = ClassForm(request.POST)
        if course_form.is_valid() and class_form.is_valid():
            course = course_form.save(commit=False)
            course.created_by = request.user
            course.save()
            # 绑定班级到刚创建的课程
            class_obj = class_form.save(commit=False)
            class_obj.course = course
            class_obj.save()
            return redirect('course_list')
    else:
        course_form = CourseForm()
        class_form = ClassForm()
    return render(request, 'create_course.html', {'course_form': course_form, 'class_form': class_form})

对应的表单类:

# forms.py
from django import forms
from .models import Course, Class

class CourseForm(forms.ModelForm):
    class Meta:
        model = Course
        fields = ['title', 'description']

class ClassForm(forms.ModelForm):
    class Meta:
        model = Class
        fields = ['class_name']

四、学生注册到班级的逻辑

实现学生自主选择班级注册的视图:

# views.py
@login_required
def enroll_class(request):
    if request.user.role != 'student':
        return redirect('home')
    
    if request.method == 'POST':
        class_id = request.POST.get('class_id')
        target_class = Class.objects.get(id=class_id)
        # 创建或更新学生的班级关联
        student_profile, created = StudentProfile.objects.get_or_create(user=request.user)
        student_profile.enrolled_class = target_class
        student_profile.save()
        return redirect('student_dashboard')
    
    # 获取所有可选班级
    classes = Class.objects.all()
    return render(request, 'enroll_class.html', {'classes': classes})

五、模板示例(创建课程页面)

<!-- templates/create_course.html -->
<h2>创建新课程</h2>
<form method="post">
    {% csrf_token %}
    {{ course_form.as_p }}
    <h3>关联班级</h3>
    {{ class_form.as_p }}
    <button type="submit">创建</button>
</form>

六、权限控制补充

  • 视图中通过request.user.role判断角色,限制教师才能创建课程,学生只能访问注册班级的内容。
  • 学生访问课程时,可通过request.user.studentprofile.enrolled_class.course获取自己的专属课程。

内容的提问来源于stack exchange,提问作者Naig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:10:42