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>
crm录入成绩modelformset组件的更多相关文章
- CRM项目之stark组件(2)
那么从今天开始呢,我们就要开始设计属于我们自己的admin组件,起个名字就叫stark吧(当然你愿意叫什么都可以). stark组件之四步走 仿照admin组件实现流程,stark组件要实现四件事情: ...
- CRM系统之stark组件流程分析
CRM系统主要通过自定义stark组件来实现的(参照admin系统自定义): STARK组件: 1 admin组件 1 如何使用admin 2 admin源码 3 创建自己的admin组件:stark ...
- day 64 crm项目(1) admin组件的初识别以及应用
前情提要: 今天进入项目学习阶段,crm 一个又老又土又实用的入门项目 一:django回顾 二:事前准备 1:首先创建django项目 2:在model中创建数据 from django.db im ...
- CRM项目之stark组件
. stark也是一个app(用startapp stark创建),目标时把这个做成一个可以拔插的组件 . setting文件下INSTALLED_APPS 路径要配置好(app的注册) . 写好si ...
- CRM项目之stark组件(1)
admin组件 admin组件的简单使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py ...
- crm项目之stark组件前戏(二)
stark组件的设计主要来源于django中admin的功能,在django admin中只需要将模型表进行注册,就可以在页面对该表进行curd的动作,那么django admin是如何做的呢? 在d ...
- day 66 crm(3) 自创组件stark界面展示数据
前情提要: 接着上一节的.stark自创组件的展示效果编写 展示数据 一:按照默认自带数据展示 即无一对一,一对多 1:先获取queryset对象 2:获取当前操作模型表对象数据 注意:list_d ...
- day 65 crm(2) admin源码解析,以及简单的仿造admin组件
前情提要: crm中的admin组件重写. 一:admin的autodiscover 作用:实现扫面该项目中的所有的admin 1:执行顺序-> 按照注册的顺序执行 二:单例模式 1:普通案例的 ...
- CRM项目讲解和django知识点回顾
今天想把之前写的CRM项目梳理下,顺便回顾一下djiango的部分重要知识. 1.登录页面(包含简单验证码) 首先来看下CRM的登录页面,样式啥的不重要,大家可以去jquery ui的网站上或者其他地 ...
随机推荐
- NetBeans+Xdebug调试原理
使用Xdebug的远程调试,Xdebug作为一个嵌入到PHP的程序,扮演着客户端的角色,而IDE则作为服务器.下面的动态图展示了连接建立的过程. 服务端的IP为10.0.1.2, 使用HTTP协议,端 ...
- pandas分组和聚合
Pandas分组与聚合 分组 (groupby) 对数据集进行分组,然后对每组进行统计分析 SQL能够对数据进行过滤,分组聚合 pandas能利用groupby进行更加复杂的分组运算 分组运算过程:s ...
- Java微信公众平台开发(三)--接收消息的分类及实体的创建
转自:http://www.cuiyongzhi.com/post/41.html 前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端post的消息类型,这里我们将建立消息实 ...
- php SqlServer 中文汉字乱码
php SqlServer 中文汉字乱码,用iconv函数转换 查询显示的时候,从GB转换为UTF8 <?php echo iconv('GB2312','UTF-8',$row['Name'] ...
- BIO与NIO、AIO的区别(转)
IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...
- Redis搭建(一):单实例
环境:CentOS6.4 + redis3.2.4 一.安装 cd /opt tar -zxf redis-3.2.4.tar.gz make make install PREFIX=/usr/loc ...
- Redis安装文档
1.前置条件 前置条件:linux已经可以上网,参考:https://www.cnblogs.com/ZenoLiang/p/10201875.html 2.安装redis 2.1依赖包检查 1. ...
- maven安装错误履历
1\:maven cannot find entry:"/src/main/java" 先删除source下的文件夹 再新建文件夹
- 屌爆的xamarin,一人单挑google/apple/windows
一个IDE就把3大手机平台全包了: android:自带模拟器xamarin player,速度堪比genymotion. ios:需要一台mac机辅助,一旦配好后可全程脱离,连ios模拟器都给镜像到 ...
- Entity Framework 6.0 Tutorials(10):Index Attribute
Index Attribute: Entity Framework 6 provides Index attribute to create Index on a particular column ...