Django中文件上传完成后将作业待提交状态改为已提交的问题咨询
实现步骤如下:
1. 调整模型关联关系
你当前的Submissions提交记录模型没有和对应的Assignment作业绑定,后端无法识别提交的是哪份作业,先修改models.py:
class Assignment(models.Model): assignment_creator = models.ForeignKey(Teacher, on_delete=models.CASCADE) assignment_title = models.CharField(max_length=30) assignment_details = models.TextField() assignment_date = models.DateField(auto_now_add=True) # 约定 False=待提交Pending,True=已提交Submitted assignment_status = models.BooleanField(default=False) class Submissions(models.Model): submitted_by = models.ForeignKey(Student, on_delete=models.CASCADE) submission_file = models.FileField(null=False) submitted_to = models.ForeignKey(Teacher, on_delete=models.CASCADE, null=True) # 新增关联作业的外键 assignment = models.ForeignKey(Assignment, on_delete=models.CASCADE)
修改后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。
2. 修改前端模板补全参数
首先修正模板里csrf的拼写错误,同时新增隐藏字段传递当前作业ID,再把写死的状态改成动态渲染:
<tr> <td>{{assignment.assignment_date}}</td> <td>{{assignment.assignment_creator}}</td> <td>{{assignment.assignment_title}} </td> <td> <form enctype="multipart/form-data" action="{% url 'assignment' %}" method="POST"> <!-- 修正csrf拼写错误 --> {% csrf_token %} <!-- 新增隐藏字段传递作业ID --> <input type="hidden" name="assignment_id" value="{{assignment.id}}"> <input required type="file" name="inputFile" placeholder="upload"> <button>Upload</button> </form> </td> <td> {% if assignment.assignment_status %} <span class="bg-success text-white">Submitted</span> {% else %} <span class="bg-warning text-white">Pending</span> {% endif %} </td> </tr>
3. 调整视图层逻辑,提交后自动改状态
修改views.py的提交逻辑,保存提交记录后同步修改对应作业的状态:
if request.method == "POST": uploaded_file = request.FILES['inputFile'] # 获取前端传递的作业ID assignment_id = request.POST.get('assignment_id') # 获取当前登录的学生实例 student = Student.objects.get(student_username=request.user) # 获取对应作业实例 target_assignment = Assignment.objects.get(id=assignment_id) # 保存提交记录,关联学生、作业、批改老师 Submissions.objects.create( submitted_by=student, submission_file=uploaded_file, submitted_to=target_assignment.assignment_creator, assignment=target_assignment ) # 修改作业状态为已提交 target_assignment.assignment_status = True target_assignment.save()
补充说明:如果你的作业状态是每个学生单独维度(也就是同一份作业A学生提交了仅改A的状态,B学生没提交还是待提交),那你需要把
assignment_status字段从Assignment模型移到Submissions模型,或者单独建学生-作业关联表存储状态,查询渲染的时候判断当前学生对应作业有没有提交记录即可。
内容的提问来源于stack exchange,提问作者coder xx
相关产品推荐
相关产品推荐

