
正文
crm录入成绩modelformset组件
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
不基于formset组件的普通写法>>
views:
class RecordScoreView(View):
# 录入成绩
def get(self, request,class_study_record_id):
class_study_record_obj = ClassStudyRecord.objects.get(pk=class_study_record_id) student_study_record_list = class_study_record_obj.studentstudyrecord_set.all()
score_choices = StudentStudyRecord.score_choices
return render(request,"study_record/record_score.html",locals()) def post(self, request, class_study_record_id):
print(request.POST)
data_dict = {}
for key, val in request.POST.items():
print(key, val)
if key == "csrfmiddlewaretoken":
continue # 跳过
field, pk = key.rsplit("_", 1) # 切割 以右为分分一次
if pk not in data_dict: data_dict[pk] = {
field: val
}
else:
data_dict[pk][field] = val print(data_dict)
for pk, data in data_dict.items():
StudentStudyRecord.objects.filter(pk=pk).update(**data)
#StudentStudyRecord.objects.filter(pk=pk).update(**{field:val}) 等同于field = val 打散的格式
return redirect(reverse("class_study_record"))
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>录入成绩</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
</head>
<body>
<h2 style="text-shadow: 4px 4px 4px rgba(10,21,49,0.72), 0px 0px 2px rgba(10,21,49,0.69);color: #254e99">
录入{{ class_study_record_obj.class_obj }},day{{ class_study_record_obj.day_num }}成绩
</h2>
<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 student_study_record in student_study_record_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ student_study_record.student }}</td>
<td>{{ student_study_record.get_record_display }}</td>
<td>
<select name="score_{{ student_study_record.pk }}" id="">
{% for score_choice in score_choices %}
{% if student_study_record.score == score_choice.0 %}
<!-- selected 预选中-->
<option selected value="{{ score_choice.0 }}">{{ score_choice.1 }}</option>
{% else %}
<option value="{{ score_choice.0 }}">{{ score_choice.1 }}</option>
{% endif %}
{% endfor %} </select>
</td>
<td>
<textarea name="homework_note_{{ student_study_record.pk }}" id="" cols="20" rows="1" class="form-control">{{ student_study_record.homework_note|default:"" }}</textarea>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<input type="submit" class="btn btn-success pull-right baocun" value="保存">
</form>
</div>
<script src="/static/AdminLTE-2.3.3/plugins/jQuery/jQuery-2.2.0.min.js"></script>
<script>
$(function () {
$(".baocun").click(function () {
alert("保存成功!")
})
})
</script>
</body>
</html>
基于modelformset的写法>>
用modelformset首先得有一个modelform类
class StudentStudyRecordModelForm2(forms.ModelForm):
class Meta:
model=StudentStudyRecord
# 需要编辑校验的字段,不编辑的不协商__all__所有字段
fields=["score","homework_note"]
view:
引入modelformset:
from django.forms.models import modelformset_factory
CBV 视图:
# 基于ModelFormSet 的录入成绩视图| 多个表单
class RecordScoreView2(View): def get(self, request,class_study_record_id):
model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyRecordModelForm2, extra=0) #extra=0设置额外增添的编辑表单个数
queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id) # 把当前班级对象下面的所有学生学习记录对象传给ModelFormSet
# formset每一条学生记录对象做成一个表单对象
formset = model_formset_cls(queryset=queryset)
return render(request,"study_record/record_score_formset.html",locals()) def post(self, request,class_study_record_id):
model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyRecordModelForm2, extra=0)
queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id)
print("request.POST",request.POST)
formset=model_formset_cls(request.POST)
if formset.is_valid():
formset.save() print(formset.errors) return redirect(reverse("class_study_record"))
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>录入成绩</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
</head>
<body>
<div class="panel panel-default">
<div class="panel-heading">学习记录</div>
<div class="panel-body">
<div style="width: 680px;margin: 0 auto;">
<form method="post" action="">
{% csrf_token %}
<!--用formset必须加这句话-->
{{ formset.management_form }} <table class="table table-bordered">
<thead>
<tr>
<th>姓名</th>
<th>考勤</th>
<th>作业成绩</th>
<th>作业评语</th>
</tr>
</thead>
<tbody>
{% for form in formset %}
<tr>
{{ form.id }}
<td>{{ form.instance.student }}</td>
<!--instance 不编辑的字段,设置为原值不渲染-->
<td>{{ form.instance.get_record_display }} </td>
<td>{{ form.score }} </td>
<td>{{ form.homework_note }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<input type="submit" class="btn btn-success pull-right baocun" value="保存">
</form>
</div>
</div>
</div>
<hr>
<script src="/static/AdminLTE-2.3.3/plugins/jQuery/jQuery-2.2.0.min.js"></script>
<script>
$(function () {
$(".baocun").click(function () {
alert("保存成功!")
})
})
</script>
</body>
</html>






