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

Django高校管理系统作业功能URL跳转异常:相对路径拼接错误排查

问题原因

核心问题出在全局基础模板base.html的侧边栏导航链接写法上:你使用了无前置斜杠的相对路径(比如href="studentattendancereport"、href="assignment"),浏览器解析相对路径时会自动拼接当前页面的父路径,所以当你处于/abc/pqr路径下时,点击链接就会跳转到/abc/xyz而不是根路径下的/xyz。
你其他功能没出问题大概率是因为那些功能页面都在根路径层级,没有嵌套路径,所以相对路径刚好没出问题,而作业详情页路径是/assignmentupload/xxx属于嵌套路径,就触发了这个问题。

修复方案

1. 修正base.html的侧边栏链接

所有内部链接统一使用Django的{% url %}模板标签生成绝对路径,替换原来的硬编码相对路径:

<!-- 替换前 -->
<a class=" nav-item nav-link {% if url_name == 'studentattendanceview'%}active{% endif %}"
    href="studentattendancereport">Attendance</a>
<a class="nav-item nav-link {% if url_name == 'studentattendanceview'%}active{% endif %}"
    href="marksreportstudent">Marks</a>
<a class="nav-item nav-link {% if url_name == 'assignment' or url_name == 'assignmentupload' %}active{% endif %}"
    href="assignment">Assignment</a>
<a class="nav-item nav-link {% if url_name == 'applyforleave'%}active{% endif %}"
    href="applyforleavestudent">Leave</a>

<!-- 替换后 -->
<a class=" nav-item nav-link {% if url_name == 'studentattendanceview'%}active{% endif %}"
    href="{% url 'studentattendancereport' %}">Attendance</a>
<a class="nav-item nav-link {% if url_name == 'studentattendanceview'%}active{% endif %}"
    href="{% url 'marksreportstudent' %}">Marks</a>
<a class="nav-item nav-link {% if url_name == 'assignment' or url_name == 'assignmentupload' %}active{% endif %}"
    href="{% url 'assignment' %}">Assignment</a>
<a class="nav-item nav-link {% if url_name == 'applyforleave'%}active{% endif %}"
    href="{% url 'applyforleavestudent' %}">Leave</a>

如果不想用{% url %},也可以给所有硬编码路径加前置斜杠变成根相对路径,比如href="/assignment",但更推荐用URL模板标签,后续改路径名不需要逐个改模板。

2. 补充修复其他隐藏问题

  • cmsapp/urls.py路径加斜杠结尾:符合Django的路径规范,避免301重定向跳转的异常:
    path('assignment/', studentviews.assignments, name='assignment'),
    path('assignmentupload/<int:id>/', studentviews.assignment_upload, name='assignmentupload'),
    # 其他路径也统一加末尾斜杠
    
  • assignment_report.html更新表单补全action:当前表单action为空,提交时会默认提交到当前页面路径,虽然当前场景可用,但显式写全更稳妥:
    <form action="{% url 'assignmentupload' assignment.id %}" method="POST" class="form-group" enctype="multipart/form-data">
    
  • assignment_upload视图补充更新逻辑:现在的POST逻辑只支持新增提交,已提交作业的更新请求会触发重复提交报错,修改POST逻辑适配更新场景:
    def assignment_upload(request, id):
        assignment = Assignment.objects.get(id=id)
        student_id = Student.objects.get(admin=request.user.id)
        assignment_report = Student_Assignment.objects.filter(assignment_id=assignment.id, student_id=student_id).first()
        if request.method == 'POST':
            assignment_file = request.FILES['assignment']
            try:
                if assignment_report:
                    # 已提交就更新
                    assignment_report.document = assignment_file
                    assignment_report.save()
                    messages.success(request, '作业更新成功。')
                else:
                    # 未提交就新增
                    Student_Assignment.objects.create(assignment_id=assignment, student_id=student_id, document=assignment_file)
                    messages.success(request, '作业提交成功。')
                return redirect('assignment')
            except Exception as e:
                messages.error(request, '操作失败,请稍后重试。')
                return redirect('assignment')
        else:
            context = {'assignment':assignment, 'assignment_report':assignment_report, 'student_id':student_id}
            if assignment_report:    
                return render(request, 'cmsapp/student/assignment_report.html', context)
            else:
                return render(request, 'cmsapp/student/assignment_upload.html', context)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 02:36:01