不基于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组件的更多相关文章

  1. CRM项目之stark组件(2)

    那么从今天开始呢,我们就要开始设计属于我们自己的admin组件,起个名字就叫stark吧(当然你愿意叫什么都可以). stark组件之四步走 仿照admin组件实现流程,stark组件要实现四件事情: ...

  2. CRM系统之stark组件流程分析

    CRM系统主要通过自定义stark组件来实现的(参照admin系统自定义): STARK组件: 1 admin组件 1 如何使用admin 2 admin源码 3 创建自己的admin组件:stark ...

  3. day 64 crm项目(1) admin组件的初识别以及应用

    前情提要: 今天进入项目学习阶段,crm 一个又老又土又实用的入门项目 一:django回顾 二:事前准备 1:首先创建django项目 2:在model中创建数据 from django.db im ...

  4. CRM项目之stark组件

    . stark也是一个app(用startapp stark创建),目标时把这个做成一个可以拔插的组件 . setting文件下INSTALLED_APPS 路径要配置好(app的注册) . 写好si ...

  5. CRM项目之stark组件(1)

    admin组件 admin组件的简单使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py ...

  6. crm项目之stark组件前戏(二)

    stark组件的设计主要来源于django中admin的功能,在django admin中只需要将模型表进行注册,就可以在页面对该表进行curd的动作,那么django admin是如何做的呢? 在d ...

  7. day 66 crm(3) 自创组件stark界面展示数据

    前情提要:  接着上一节的.stark自创组件的展示效果编写 展示数据 一:按照默认自带数据展示 即无一对一,一对多 1:先获取queryset对象 2:获取当前操作模型表对象数据 注意:list_d ...

  8. day 65 crm(2) admin源码解析,以及简单的仿造admin组件

    前情提要: crm中的admin组件重写. 一:admin的autodiscover 作用:实现扫面该项目中的所有的admin 1:执行顺序-> 按照注册的顺序执行 二:单例模式 1:普通案例的 ...

  9. CRM项目讲解和django知识点回顾

    今天想把之前写的CRM项目梳理下,顺便回顾一下djiango的部分重要知识. 1.登录页面(包含简单验证码) 首先来看下CRM的登录页面,样式啥的不重要,大家可以去jquery ui的网站上或者其他地 ...

随机推荐

  1. 一个电脑同时运行 64bit 和 32bit 的eclipse 如何匹配 jdk环境

    一个电脑同时运行 64bit 和 32bit   的  eclipse 如何匹配 jdk环境 1 eclipse 分 64bit 和 32bit 两种.  64bit的eclipse 只能搭配 64b ...

  2. openstack resize 更新显卡驱动程序解决问题

  3. table td 实现细边框的样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org ...

  4. Java面向对象-package import关键字

    Java面向对象-package import关键字 package包关键字,在java中,有包的概念,主要是用来归类 分类作用: 便于项目的开发和维护: 这里截取随便截取一个我最近在开发的一个开源工 ...

  5. leetcode783

    对BST树进行中序遍历,得到递增序列,然后依次计算相邻两元素之间的差,并保存最小的差. class Solution { public: vector<TreeNode*> V; void ...

  6. 数据库SQL优化大总结之 百万级数据库优化方案 【转载】

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  7. 【总结整理】关于GrowingIO、友盟、google analysis等数据分析

    作者:纯银V链接:https://www.jianshu.com/p/394ec6c96c98來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. 埋点主要分为四步:第一步是 ...

  8. jmap, jhat命令

    jmap命令有下面几种常用的用法 jmap [pid] jmap -histo:live [pid] >a.log jmap -dump:live,format=b,file=xxx.xxx [ ...

  9. SpringBoot15 sell02 订单模块

    1 订单模块 1.1 MySQL数据表 订单模块涉及到两个数据表: 订单表:主要存储订单相关的基本信息 DROP TABLE IF EXISTS `order_master`; CREATE TABL ...

  10. ROS indigo 删除和安装

    删除比较容易:  sudo apt-get remove ros-jade-desktop-full 但是如果怕删不干净可以采用: sudo apt-get remove ros-*  ,但是不确定会 ...