You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:基于Django实现在线作业提交系统的多用户账户构建

如何用Django实现多用户角色的在线作业提交系统

嘿,我来帮你搞定这个毕业设计的多用户权限系统!基于Django的话,咱们可以分步骤来实现,逻辑清晰还容易维护,完全符合你需求里的「部门管理员注册讲师、学生自行注册」的规则。

1. 扩展Django自带的User模型

Django自带的User模型已经有用户名、密码、邮箱这些基础字段,但咱们需要给用户加一个「角色类型」的区分。最推荐的方式是用AbstractUser扩展,这样不用修改默认的auth表结构,还能保留Django自带的认证功能。

在你的app的models.py里写这段代码:

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

class CustomUser(AbstractUser):
    USER_TYPE_CHOICES = (
        ('student', '学生'),
        ('lecturer', '讲师'),
        ('department', '部门管理员'),
    )
    user_type = models.CharField(max_length=20, choices=USER_TYPE_CHOICES, default='student')

    # 可选:给不同角色加关联字段,比如部门管理员关联某个部门
    # department = models.ForeignKey(Department, on_delete=models.SET_NULL, null=True, blank=True)

然后记得在settings.py里指定自定义用户模型:

AUTH_USER_MODEL = 'your_app_name.CustomUser'

2. 创建不同角色的注册视图

接下来要做两个注册流程:学生自行注册,部门管理员专属的讲师注册。

学生注册视图

学生注册是开放的,直接用Django的UserCreationForm或者自定义表单,只允许用户选择「学生」角色(或者默认就是学生,不让用户改)。

先写表单(forms.py):

from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser

class StudentRegistrationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'password1', 'password2')
    
    # 强制设置用户类型为学生,不让前台修改
    def save(self, commit=True):
        user = super().save(commit=False)
        user.user_type = 'student'
        if commit:
            user.save()
        return user

然后写视图(views.py):

from django.shortcuts import render, redirect
from .forms import StudentRegistrationForm

def student_register(request):
    if request.method == 'POST':
        form = StudentRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')  # 注册成功跳登录页
    else:
        form = StudentRegistrationForm()
    return render(request, 'student_register.html', {'form': form})

部门管理员注册讲师

这个视图需要权限控制:只有部门管理员才能访问,而且注册的用户只能是「讲师」角色。

先写讲师注册表单:

class LecturerRegistrationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'password1', 'password2')
    
    def save(self, commit=True):
        user = super().save(commit=False)
        user.user_type = 'lecturer'
        if commit:
            user.save()
        return user

然后写视图,加个自定义装饰器来检查用户是否是部门管理员:

from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied

def department_admin_required(view_func):
    def wrapper(request, *args, **kwargs):
        if request.user.is_authenticated and request.user.user_type == 'department':
            return view_func(request, *args, **kwargs)
        else:
            raise PermissionDenied
    return wrapper

@login_required
@department_admin_required
def lecturer_register(request):
    if request.method == 'POST':
        form = LecturerRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('admin_dashboard')  # 注册成功跳管理员后台
    else:
        form = LecturerRegistrationForm()
    return render(request, 'lecturer_register.html', {'form': form})

3. 定制登录逻辑与页面

统一用Django的登录视图,但登录成功后根据用户角色跳转到不同的页面。可以重写LoginView

from django.contrib.auth.views import LoginView

class CustomLoginView(LoginView):
    template_name = 'login.html'  # 你的登录页面模板

    def get_success_url(self):
        # 根据用户角色跳转不同页面
        if self.request.user.user_type == 'department':
            return '/department/dashboard/'
        elif self.request.user.user_type == 'lecturer':
            return '/lecturer/dashboard/'
        else:  # student
            return '/student/dashboard/'

然后在urls.py里配置这个登录视图:

from django.urls import path
from .views import student_register, lecturer_register, CustomLoginView

urlpatterns = [
    path('student/register/', student_register, name='student_register'),
    path('lecturer/register/', lecturer_register, name='lecturer_register'),
    path('login/', CustomLoginView.as_view(), name='login'),
    # 其他路由...
]

4. 页面访问权限控制

除了注册视图,其他页面比如讲师后台、管理员后台也需要限制访问。可以用刚才的department_admin_required装饰器,或者给讲师写个类似的装饰器:

def lecturer_required(view_func):
    def wrapper(request, *args, **kwargs):
        if request.user.is_authenticated and request.user.user_type == 'lecturer':
            return view_func(request, *args, **kwargs)
        else:
            raise PermissionDenied
    return wrapper

然后给讲师的视图加装饰器:

@login_required
@lecturer_required
def lecturer_dashboard(request):
    # 讲师后台逻辑
    return render(request, 'lecturer_dashboard.html')

5. 模板里的角色判断

在模板里也可以根据用户角色显示不同内容,比如导航栏:

{% if user.is_authenticated %}
    {% if user.user_type == 'department' %}
        <a href="{% url 'lecturer_register' %}">注册讲师</a>
        <a href="{% url 'department_dashboard' %}">管理员后台</a>
    {% elif user.user_type == 'lecturer' %}
        <a href="{% url 'lecturer_dashboard' %}">讲师后台</a>
        <a href="{% url 'assign_homework' %}">布置作业</a>
    {% else %}
        <a href="{% url 'student_dashboard' %}">学生后台</a>
        <a href="{% url 'submit_homework' %}">提交作业</a>
    {% endif %}
    <a href="{% url 'logout' %}">退出登录</a>
{% else %}
    <a href="{% url 'student_register' %}">学生注册</a>
    <a href="{% url 'login' %}">登录</a>
{% endif %}

一些注意事项

  • 数据库迁移:修改完CustomUser模型后,记得跑python manage.py makemigrationspython manage.py migrate
  • 密码安全:Django的UserCreationForm已经自动处理了密码加密,不用自己写加密逻辑
  • 表单验证:可以给表单加额外的验证规则,比如邮箱唯一性、用户名格式等
  • 部门管理员的初始化:因为部门管理员不能自己注册,你可以用Django的后台创建第一个部门管理员,或者写个脚本初始化

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

火山引擎 最新活动