更新学生学习记录:
在views.py 中
class StudyRecordDetailView(View):
def get(self,request,class_record_id):
#找到要跟进的班级信息:
class_record_obj = models.ClassStudyRecord.objects.get(pk=class_record_id)
all_study_record = models.StudentStudyRecord.objects.filter(classstudyrecord = class_record_obj)
#把分数列表传到前端页面上显示:
score_choices = models.StudentStudyRecord.score_choices
return render(request,'student/study_record_detail.html',{'class_record_obj':class_record_obj,'all_study_record':all_study_record,'score_choices':score_choices})
def post(self,request,class_record_id):
for key , val in request.POST.items():
if key == 'crsfmiddlewaretoken':
continue
field,pk = key.rsplit('_',1)
models.StudentStudyRecord.objects.filter(**{'pk':pk}).update(**{field:val})
return self.get(request,class_record_id)
return redirect(reverse('study_decord',args=(class_record_id, )))
#对重复性操作我们选择更改数据结构
'''
更改数据结构:
{
1:{'score':85,'homework_note':'333'},
2: {'score':85,'homework_note':'333'},
}
'''
data_dict = {}
for key , val in request.POST.items():
if key == 'crsfmiddlewaretoken':
continue
field,pk = key.rsplit('_',1)
if pk in data_dict:
data_dict[pk][field] = val
else:
data_dict[pk]={
field:val,
}
for spk,sdata in data_dict.items():
models.StudentStudyRecord.objects.filter(**{'pk':spk}).update(**sdata)
return redirect(reverse('study_decord',args=(class_record_id, )))
study_record_detail.html
<div class="container">
<form action="" method="post">
{% csrf_token %}
<table class="table table-hover table-striped">
<thead>
<tr>
<th>编号</th><!--表头-->
<th>姓名</th>
<th>考勤</th>
<th>成绩</th>
<th>批语</th>
</tr>
</thead>
<tbody>
{% for studentstudyrecord in all_study_recored %}
<tr>
<td>{{ forloop.counter }}</td><!--表格单元-->
<td>{{ studentstudyrecord.student }}</td>
<td>{{ studentstudyrecord.get_record_display }}</td>
<td>
<select name="score_{{ studentstudyrecord.pk }}" id="">
{% for choice in score_choices %}
{% if studentstudyrecord.score == choice.0 }
<option value='{{choice.0}}' selected>
{{ choice.1 }}
</option>
{% else %}
<option value='{{ choice.0 }}'>
{{ choice.1}}
</option>
</select>
</td>
<td>
<textarea name="homework_note_{{ studentstudyrecord.pk }}" id="" cols="20" rows="1" class="form-control">{{ studentstudyrecord.homework_note|default:"" }}</textarea>
<!--default是设置默认值-->
</td>
</tr>
{% endfor %}
</tbody>
</table>
<input type="submit" class="btn btn-success pull-right" value="保存">
</form>
</div>
<hr>
</body>
</html>
知识点补充:
- selected属性
带有预先选定的选项下来列表:
<option selected='selected'>aabb</option>
定义和用法:
selected 属性规定在页面加载时预先选定该选项。
被预选的选项会显示在下拉列表的最前面的位置。
也可以在页面加载后通过JavaScript设置selected属性。
实例:
<html>
<body>
<select>
<option>Volvo</option>
<option selected="selected">Saab</option>
<option>Mercedes</option>
<option>Audi</option>
</select>
</body>
</html>
这时多选框显示Saab 下拉后显示Volvo,Mercedes,Audi
- textarea
文本描述 textarea
定义和用法:
<textarea> 标签定义多行的文本输入控件。
文本区可容纳无限量的文本,其中的文本默认字体是等宽字体。
可以通过cols和rows属性来规定textarea的尺寸,不过更好的办法是使用css的height和width属性。
实例:
<textarea rows="3" cols="20">
</textarea>
- table标签
HTML <table>标签
<table border='1'>
<tr>
<th>Month</th>
<th>Savings</th>
</tr>
<tr>
<td>January</td>
<td>$100</td>
</tr>
</table>
定义和用法:
<table>标签定义HTML表格
简单的HTML表格由table元素以及一个或多个tr、th或td元素组成。
tr元素定义表格行,th元素定义表头,td元素定义表格单元
-
forloop
forloop.counter 表示当前迭代数从1开始 forloop.counter0 表示从0开始 forloop.first 判断此循环是否是第一次循环
点击学详,进入待编辑的班级:
<td><a href='{% url 'study_decord' record.pk} %'>学详</a></td>