Django实现根据用户选择动态更新学生作业成绩字段
解决方案
一、前端动态同步输入框name与选中作业
通过JavaScript监听下拉选择框的变化,实时修改成绩输入框的name属性,使其与选中的作业名称保持一致:
<h1>Fill in student assignment marks below</h1> <form action="" method="POST">{% csrf_token %} <input type="text" class="field" placeholder="student ID" name="student"> <label for="name">Choose an Assignment:</label> <select name="name" id="name"> <option value="A1">A1</option> <option value="A2">A2</option> <option value="A3">A3</option> <option value="A4">A4</option> <option value="A5">A5</option> <option value="A6">A6</option> </select> <input type="text" class="field" placeholder="percentage" name="A1" id="mark-input"> <button type="submit" class="btn">save</button> </form> <script> // 获取下拉框和输入框元素 const assignmentSelect = document.getElementById('name'); const markInput = document.getElementById('mark-input'); // 页面加载时初始化输入框name(默认选中A1) markInput.name = assignmentSelect.value; // 监听下拉框变化事件 assignmentSelect.addEventListener('change', function() { markInput.name = this.value; }); </script>
二、后端逻辑简化优化
原代码存在大量重复的数据库查询和赋值操作,可通过Python的setattr()方法统一处理,同时减少数据库查询次数:
def upload_A_marks(request): if request.method == 'POST': student_id = request.POST.get('student') assignment_name = request.POST.get('name') mark_value = request.POST.get(assignment_name) if student_id and assignment_name and mark_value: try: # 仅查询一次数据库 student_mark = MarksTable.objects.get(student=student_id) # 动态设置对应作业的成绩 setattr(student_mark, assignment_name, mark_value) student_mark.save() except MarksTable.DoesNotExist: # 处理学生不存在的情况,可根据需求添加提示逻辑 pass return render(request, "upload_A_marks.html")
优化说明:
- 用
request.POST.get()替代直接索引,避免键不存在时抛出异常 - 仅执行一次数据库查询,提升性能
- 通过
setattr()动态设置模型属性,消除重复的if-else分支 - 增加
try-except捕获学生不存在的异常,提升代码健壮性
内容的提问来源于stack exchange,提问作者scholar from next door
相关产品推荐
相关产品推荐

