不基于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. autoit 简单使用-- 操作windows窗口

    autoit 简单使用 autoit中文交流论坛: http://www.autoitx.com/index.php 1 下载 autoit 中文安装包 : https://yunpan.cn/OcP ...

  2. php学习之if

    <html> <head> <title>xxx</title> <style> #tian{ color:blue; float:left ...

  3. C#通用模块专题

    开源 程序设计 常用组件 加载图片,播放音乐.视频,摄像头拍照 文件读写(txt.xml.自定义文件格式(后缀名)) 串口通信 稳定的串口读写:http://blog.csdn.net/kolvin2 ...

  4. 处理大数据对象clob数据和blob数据

    直接上下代码: package com.learn.jdbc.chap06; import java.io.File; import java.io.FileInputStream; import j ...

  5. IOS ipa安装不上 e8000087

    iPhone5是32位的,所以按照64位编译出来的32位不支持,下面3种方案的,选择第3中就可以了. 5S是64位. e8000087: Your iOS device does not suppor ...

  6. Stars(树状数组单点更新)

    Astronomers often examine star maps where stars are represented by points on a plane and each star h ...

  7. Timer的缺陷

  8. Dubbo简单介绍及其和zookeeper的关系

    何为Dubbo ​ Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维 ...

  9. 【HDU5391】Zball in Tina Town

    [题目大意] 一个球初始体积为1,一天天变大,第一天变大1倍,第二天变大2倍,第n天变大n倍.问当第 n-1天的时候,体积变为多少.注意答案对n取模. [题解] 根据威尔逊定理:(n-1)! mod ...

  10. ubuntu下源码方式安装php5.4

    一.安装前准备 下载php-5.4.13.tar.gz最新版本放到/user/src目录下 二.安装 因为在安装php过程中,会依赖安装很多库,为了不让你反复安装,建议按步骤操作 安装autoconf ...