复习先知

关于三张表的编辑学生成绩
在跨表查询的对象查询种,只能通过找到两张表的关联的对象,
进行跨表,就是在一对多或多对多的模型找到他们俩的class_id或student_id
在关联时,会通过他们找到所要查询的id,或字段,进而找到他们的字段
进而查询出对象,这个表的对象, .出来
在这种跨三表的途中,编辑跟添加同理.都是通过过
过滤出你要找到学生的对象 学生成绩关联班级成绩 班级成绩关联班级 班级关联学生
这就是这张表的精髓 关于modelformset 可以省去复杂跨表的骚操作
也可以一次性多删除
第一步
引入from django.forms.models import modelformset_factory modelformset_factory(含2个变量,还有一个默认为1)
model() modelform() extra=1
1.实例化对象
2.找到点击的对象 queryset对象
3.实例化对象的方法(queryset=queryset)
返回给页面 自动给你
页面: 一样 但需要标注{{formset.management_form}} 在编辑时候,
1.实例化对象modelformset_factory()
2.formset(request.post)
3.if formset.is_valid() form的通病
4.formset.save()

复杂版

将字段设置联合唯一

class Meta:
unique_together=["student","classstudyrecord"]
 class ClassStudyRecordView(View):
def get(self,request):
ClassStudyRecordlist=ClassStudyRecord.objects.all()
return render(request,"ClassStudyRecord.html",{"ClassStudyRecordlist":ClassStudyRecordlist}) def post(self, request):
print(request.POST)
func_st = request.POST.get("action")
num = request.POST.getlist("selected_pk_list") print("num", num)
if not hasattr(self, func_st):
return HttpResponse("非法输入")
else:
func = getattr(self, func_st)
queryset = ClassStudyRecord.objects.filter(pk__in=num) print("queryset", queryset)
ret = func(request, queryset)
if ret:
return ret
return redirect(request.path)
#批量删除
def patch_delete(self, request, queryset):
queryset.delete()
#批量查询,利用跨表查询查询创建字段,为了避免添加重复使用联合唯一
def patch_choice(self,request,queryset):
try:
for i in queryset:
for item in i.class_obj.student_set.all():
StudentStudyRecord.objects.create(student=item,classstudyrecord=i)
except Exception as e:
pass

views.py

跳转页面进行编辑,通过获取form的值构成列表循环录入成绩

 def buhui(request,id):

     if request.method=="GET":
ret=StudentStudyRecord.objects.filter(classstudyrecord_id=id)
return render(request,"student_std.html",locals())
else: user = request.POST.getlist("user")
homework = request.POST.getlist("homework")
for a,item in enumerate(ClassStudyRecord.objects.filter(pk=id).first().class_obj.student_set.all()):
print(a,item)
StudentStudyRecord.objects.filter(student=item).update(score=user[a],homework_note=homework[a])
return redirect(request.path)

views.py录入成绩

 <table>
<form action="" method="post">
{% csrf_token %}
<thead>
<tr> <th>编号</th>
<th>姓名</th>
<th>考勤</th>
<th>成绩</th>
<th>批语</th> </tr>
</thead>
<tbody> {% for consult_record in ret %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ consult_record.student }}</td>
<td>{{ consult_record.get_record_display }}</td>
<td><select name="user" id="">
{% for foo in consult_record.score_choices %}
#进行判断,若是存在值添加selected让其显示,没有显示默认
{% if consult_record.score == foo.0 %}
<option selected value="{{ foo.0 }}">{{ foo.1 }}</option>
{% else %}
<option value="{{ foo.0 }}">{{ foo.1 }}</option>
{% endif %}
{% endfor %}
<option value=""></option>
</select>
</td>
<td><input type="text" name="homework" value="{{ consult_record.homework_note }}"></td>
</tr>
{% endfor %} </tbody>
<button class="btn btn-default">提交</button> </form>
</table>

前端.html

modelformset 简单版

1.首先引入模块

from django.forms.models import modelformset_factory

2.

后端

 from django.forms.models import modelformset_factory

 class StudentStudyRecordModelForm(forms.ModelForm):
class Meta:
model=StudentStudyRecord
fields=["score","homework_note"] class RecordScoreView(View): def get(self, request,class_study_record_id):
#modelformset_factory()里面需要2个变量,model和modelform,extra默认为1,显示添加
model_formset_cls=modelformset_factory(model=StudentStudyRecord,form=StudentStudyRecordModelForm,extra=0)
queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id)
formset = model_formset_cls(queryset=queryset)
return render(request,"student/record_score.html",locals()) def post(self, request,class_study_record_id):
model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyRecordModelForm, 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(request.path)

modelformset 批量编辑

3.

前端

 <hr>

  <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.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 }}
#form.instance.为显示界面,不添加编辑页面
<td>{{ form.instance.student }}</td>
<td>{{ form.instance.get_record_display }} </td>
<td>{{ form.score }} </td>
<td>{{ form.homework_note }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<input type="submit" value="保存">
</form>
</div>
</div>
</div>
<hr>

前端.html


django modelformse批量编辑 查询学生班级成绩的更多相关文章

  1. SQL 查询:查询学生平均成绩

    编程萌新,因为遇到这么个SQL 查询的问题:在一张表A里有如下字段:学生姓名.学科名.学科成绩.写一条SQL 语句查出各科平均成绩并按学生姓名分组,按如下格式显示:学生姓名|语文|数学|英语.一开始遇 ...

  2. mysql 查询每个班级成绩前两名

  3. sql-hive笔试题整理 1 (学生表-成绩表-课程表-教师表)

    题记:一直在写各种sql查询语句,最长的有一百多行,自信什么需求都可以接,可......,想了想,可能一直在固定的场景下写,平时也是以满足实际需求为目的,竟不知道应试的题都是怎么出的,又应该怎么做.遂 ...

  4. SQL使用子查询,查找班级成绩最高分

    -- 根据要求,获取班级成绩的最高分的学生-- 第一个子查询,先去各个科目的最高,再横向比较各个科目的最高,再取最高分的那个科目-- 第二个子查询,查询每个同学的最高分-- 最后,通过第一个子查询查询 ...

  5. 《MySQL数据操作与查询》- 维护学生信息、老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息

    综合项目需求 一.系统整体功能 系统需支持以下功能: 维护学生信息.老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息 学生 Student(id,班级id,学号,姓名,性别,电话,地址,出 ...

  6. Django ORM多表查询练习

    ORM多表查询 创建表结构: from django.db import models # 创建表结构 # Create your models here. class Class_grade(mod ...

  7. Django聚合与分组查询中value与annotate的顺序问题

    在学习Django聚合与分组查询中,发现value与annotate的顺序不同时,查询结果大相径庭,经过一下午的研究,终于弄明白了,现在分享给大家,先上结论: 结论 value在annotate前面时 ...

  8. Django的ORM常用查询操作总结(Django编程-3)

    Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...

  9. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

随机推荐

  1. Linux性能优化实战学习笔记:第五十六讲

    一.上节回顾 上一节,我带你一起梳理了,性能问题分析的一般步骤.先带你简单回顾一下. 我们可以从系统资源瓶颈和应用程序瓶颈,这两个角度来分析性能问题的根源. 从系统资源瓶颈的角度来说,USE 法是最为 ...

  2. 配置中心Apollo实战

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景. 服 ...

  3. vs2019 更新之后无法用ctrl+d再设置回来..

    工具-选项-环境-键盘

  4. Aladdin and the Flying Carpet LightOJ 1341 唯一分解定理

    题意:给出a,b,问有多少种长方形满足面积为a,最短边>=b? 首先简单讲一下唯一分解定理. 唯一分解定理:任何一个自然数N,都可以满足:,pi是质数. 且N的正因子个数为(1+a1)*(1+a ...

  5. hbase源码之 compact源码(一)

    hbase compact流程较多,这里分章节介绍,首先介绍compact在regionserver中的调用流程,并不会涉及真正的compact读取合并文件的流程,后续介绍. 在regionserve ...

  6. Hash函数浅谈

    Hash函数是指把一个大范围映射到一个小范围.把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存. 除此以外,Hash函数往往应用于查找上.所以,在考虑使用Hash函数之前,需要明白它 ...

  7. [Python学习笔记-008] 使用双向链表去掉重复的文本行

    用Python处理文本文件是极方便的,当文本文件中有较多的重复的行的时候,将那些重复的行数去掉并打印诸如"...<repeats X times>..."有助于更好的浏 ...

  8. Peewee之playhouse中的数据库连接池

    参见 http://note.youdao.com/noteshare?id=104255d91b5a00d716a713ae36e911fd 目前在学习Python库的源码,这是第二篇,比较简单的功 ...

  9. 适配器模式(Adapter Pattern)--设计模式

    在生活中,想用苹果充电线给安卓的手机充电时,因为两者的接口不一样,会导致充电口无法进行匹配, 这时候,就需要适配器,将安卓的充电口转化为苹果的接口,这样就可以充电啦.已有的类与新的接口不兼容问题是很普 ...

  10. 【03】Python:分支和循环

    写在前面的话 在写代码的时候,我们的代码不可能总是一行一行语句的堆叠,有些时候我们需要对一个事物进行判断,或者很大一组数据需要循环挨个处理.这些不可能让我们一步一步的去写.所以有了接下来的分支结构和循 ...