crm作业知识点集合[二]
知识点1
前面我们实现了这个功能,就是在models中如果有了choice选项,我们可以实现在页面显示这个chocice的value值,而不是key值,我们这个知识点就是在优化一下这个点
首先如果表中有多个有choice的字段,我们难道要为每个字段都写一个函数吗,当然这个是现实的,但是确认是繁琐的
比如我们要展示2个有choice的字段,我们就需要为每个字段写2个函数
def list_record(self,obj=None,header=False):
if header:
return "签到情况"
else:
print(obj.record)
print(obj.get_record_display())
return obj.get_record_display() def list_score(self,obj=None,header=False):
if header:
return "成绩"
else:
print(obj.score)
print(obj.get_score_display())
return obj.get_score_display()
我们可以在showlist中为这个字段做单独的处理,请看下面的代码
if field_obj.choices:
print(field_obj.choices,"field_obj.choices",sep="<++++++++++++++++++++++++>")
temp = getattr(obj,"get_" + i + "_display")
else:
temp = getattr(obj,i)
我们打印的字段的choice的值如下
所以我们这里可以利用反射,实现get_字段_display的方法,重点是这里
这样,我们在list_display中就可以直接写字段了
list_display = ["student","score","record","course_record"]
知识点2
复习一下添加一个批量操作的函数的方法,具体的代码如下
class CourseRecordconfig(Starkclass):
def test_action(self, request,queryset):
print(queryset,"测试生成学习记录2")
for cr in queryset:
class_course = cr.class_obj.course
class_semester = cr.class_obj.semester temp = models.Student.objects.filter(class_list=cr.class_obj)
for student in temp:
models.StudyRecord.objects.create(
student = student,
course_record = cr
) print(student,"测试生成学习记录3") actions = [test_action,]
# test_action.__name__ = "测试批量操作的函数"
test_action.short_description = "测试生成学习记录"
知识点3
之前我们实现了list_filter的功能,现在我们需要实现另外一个功能,就是我们在课程记录表中需要添加一个a标签的一列,点击这个a标签就会能跳转到这个课程中的所有的学生的学习记录中
首先我们需要先实现把a标签显示到页面上,代码如下
def to_study_record(self,obj=None,header=False):
if header:
return "学生记录"
else:
href_url = "<a href='/stark/crm/studyrecord/?course_record={num}'>跳转</a>".format(num = obj.id)
return mark_safe(href_url) list_display = ["class_obj","day_num","teacher",to_study_record]
页面的效果如下
下面我们要实现过滤,因为我们不能把所有的学生显示出来,只能显示属于这个班级的学生,由于我们在url中已经把当前班级的id已经传进去了,下面就看下我们的过滤的函数该如何处理了
def get_filter(self,request):
from django.db.models import Q
q_filter_obj = Q()
q_filter_obj.connector = "and"
if self.list_filter:
for k in self.list_filter:
if request.GET.get(k,None):
temp = (k,request.GET.get(k))
q_filter_obj.children.append(temp)
else:
print(request.GET,"hahahahaha",type(request.GET))
if request.GET:
for k,v in request.GET.items():
if k == "p":
pass
else:
temp = (k,request.GET.get(k))
q_filter_obj.children.append(temp)
return q_filter_obj
首先我们在没有定义list_filter,但是我们还要实现过滤,所以我们这里我们要新加了一个逻辑
同样,过滤的字段需要把分页的参数去掉
这样,我们点击按钮,就会显示出这个班级的所有学生的记录
知识点4
在学习记录表中实现一个功能,就是批量编辑学生的签到情况,批量设置签到情况为迟到
代码如下
def pathc_later(self,request,queryset):
queryset.update(
record = "late"
) pathc_later.short_description = "批量迟到操作"
actions = [pathc_later,]
这里稍微看models中的字段
class StudyRecord(models.Model):
course_record = models.ForeignKey(verbose_name="第几天课程", to="CourseRecord")
student = models.ForeignKey(verbose_name="学员", to='Student')
record_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('noshow', "缺勤"),
('leave_early', "早退"),
)
record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)
页面效果如下,该功能已经实现
知识点5
实现一个如下的功能,在课程记录表中新增一列,点击这一列会跳转到这个班级的这一节次的学生的签到和学习成绩的信息
看到上面的需求,我们又需要自己在新增一个url,首先我们需要先新增一个一列,而这 一列的值都是a标签,a标签的href指向一个新的url
def to_study_record(self,obj=None,header=False):
if header:
return "学生记录"
else:
href_url = "<a href='/stark/crm/studyrecord/?course_record={num}'>跳转</a>".format(num = obj.id)
return mark_safe(href_url)
这url中我们传递一个这节次课程的id就可以了
上面的url跳转到学习记录表中,这里我们直接复用了学习记录表,没有单独写url对应的视图函数,所以这里我们只需要在学习记录表中过滤课程编辑即可
所以需要修改一下获取过滤条件的函数,为我们这个做单独的处理
def get_filter(self,request):
from django.db.models import Q
q_filter_obj = Q()
q_filter_obj.connector = "and"
if self.list_filter:
for k in self.list_filter:
if request.GET.get(k,None):
temp = (k,request.GET.get(k))
q_filter_obj.children.append(temp)
else:
if request.GET:
for k,v in request.GET.items():
if k == "p":
pass
else:
temp = (k,request.GET.get(k))
q_filter_obj.children.append(temp)
return q_filter_obj
我们的代码会单独走一条逻辑,实现的作用就是没有配置list_filter也能实现过滤,这里是一个小技巧
知识点6
实现一个可以批量录入这个班级这一节课成绩的需求
首先我们需要先新增一列数据
def record_score(self,obj=None,header=False):
if header:
return "录入成绩"
else:
record_score_url = "<a href='/stark/crm/courserecord/record_score/course_record={num}'>录入成绩</a>".format(num = obj.id)
return mark_safe(record_score_url)
然后新增一个url
def extra_url(self):
temp = []
temp_url = url(r'record_score/course_record=(?P<courseid>\d+)',self.record_socre_func)
temp.append(temp_url) return temp
然后写一个url对应的视图函数,分别对post和get的两种方式做单独的处理,这里主要是处理数据和之前不一样,因为这里是批量处理的,可以仔细研究一下代码
def record_socre_func(self,request,courseid):
if request.method == "GET":
obj_list = models.StudyRecord.objects.filter(course_record__id=courseid) return render(request,"record_score.html",locals())
else: import re
re_comp = re.compile(".*\d+$")
print(dir(request.POST))
new_update_dict = {}
for k,v in request.POST.items():
if k == "csrfmiddlewaretoken":
continue
else:
if re.match(re_comp, k):
field,pk = k.rsplit("_",1)
if pk in new_update_dict.keys(): new_update_dict[pk][field] = v
else:
new_update_dict[pk] = {field: v}
for k,v in new_update_dict.items():
models.StudyRecord.objects.filter(id=int(k)).update(
**v
)
# for k,v in request.POST.items():
# if v:
#
# if re.match(re_comp,k):
# field,pk = k.rsplit("_",1)
# # obj = models.StudyRecord._meta.get_field(field)
# # models.StudyRecord.objects.filter(id=int(pk)).update(
# # obj = v
# # )
#
# if field == "record":
# models.StudyRecord.objects.filter(id=int(pk)).update(
# record = v
# )
# elif field == "score":
# models.StudyRecord.objects.filter(id=int(pk)).update(
# score = int(v)
# )
# else:
# models.StudyRecord.objects.filter(id=int(pk)).update(
# homework_note = v
# ) return redirect(request.path)
这里我们还需要写一个单独的页面,页面的代码主要要注意我们的form表单里的k值是如何设定的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
</head>
<body>
<h3>录入成绩</h3> <div class="container">
<div class="row">
<div class="col-md-9">
<form method="post">
{% csrf_token %}
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>姓名</th>
<th>考清</th>
<th>成绩</th>
<th>批语</th>
</tr>
</thead>
<tbody>
{% for stu in obj_list %}
<tr>
<td>{{ stu.student }}</td>
<td>
<select class="form-control" name="record_{{ stu.id }}">
{% for record in stu.record_choices %}
{% if stu.get_record_displ == record.1 %}
<option value="{{ record.0 }}" selected="selected">{{ record.1 }}</option>
{% else %}
<option value="{{ record.0 }}" selected="selected">{{ record.1 }}</option>
{% endif %}
{% endfor %}
</select>
</td>
<td>
<select class="form-control" name="score_{{ stu.id }}">
{% for score in stu.score_choices %}
{% if stu.get_score_display == score.1 %}
<option value="{{ score.0 }}" selected="selected">{{ score.1 }}</option>
{% else %}
<option value="{{ score.0 }}">{{ score.1 }}</option>
{% endif %}
{% endfor %}
</select>
</td>
<td><textarea cols="30" rows="4" name="homework_note_{{ stu.id }}" class="form-control">
{{ stu.homework_note }}
</textarea></td>
</tr>
{% endfor %}
</tbody>
</table>
<input type="submit" class="btn btn-success pull-right" value="确认提交">
</form>
</div> </div>
</div>
</body>
</html>
这个页面的效果如下
crm作业知识点集合[二]的更多相关文章
- crm作业知识点集合[三]
知识点1 我们要实现一个这样的功能,在学生表中,可以查看每个学生的报名的班级的所有的成绩,就是下图的效果 1.首先我们需要在学生表中自定义一列,这一列的内容就是一个a标签,指向另外一个页面,而我们在另 ...
- crm作业知识点集合[一]
知识点1 1.当我们通过model建立一对多或者多对多的关系的时候,默认情况下,会关联所有的字段,如果我们使用djanog的forms的话,可以加一个属性,限制我这个字段只关联哪些字段,就是用下面的写 ...
- C#基础第三天-作业答案-集合-冒泡排序-模拟名片
.冒泡排序 Console.WriteLine("对集合里的数进行排序,请输入第一个数:"); int a = int.Parse(Console.ReadLine()); Con ...
- java基础知识点补充---二维数组
#java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...
- 跟着刚哥梳理java知识点——集合(十二)
Java集合分为Collection和Map两种体系 一.Collection接口: Collections接口为我们提供了以下方法: size():返回集合中元素的个数 add(Object obj ...
- java并发集合知识点(二)
我们平时写程序需要经常用到集合类,比如ArrayList.HashMap等,但是这些集合不能够实现并发运行机制,这样在服务器上运行时就会非常的消耗资源和浪费时间,并且对这些集合进行迭代的过程中不能进行 ...
- 前端新人学习笔记-------html/css/js基础知识点(二)
4月7日学到的知识点: 一:<img src="1.png" alt="美女"/> alt是给图片添加介绍,当图片没加载出来时,会直接显示a ...
- php知识点集合
--------------------------------------------------------- PHP知识大全 ------------------------ ...
- fullcalendar日历控件知识点集合
1.基本的语法: 首先,fullcalendar和JQUERY一样,以面向对象的方式来组织代码.当然,这里的面向对象不过指能够把整个fullcalendar理解为一个类,这个类里包含有非常多的属性.方 ...
随机推荐
- Mycat 水平拆分
一致性Hash理解 https://blog.csdn.net/cywosp/article/details/23397179?utm_source=blogxgwz1 十种 水平拆分 https:/ ...
- html 基础之a标签的属性target解析
学习前端,有很多标签其实有很多不同的功能,但是用到的不多,所以就没有发现:当发现的时候,觉得很不可思议,有耳目一新的感觉.例如a 标签,之前只是知道,使用a标签,可以打开一个链接,然后访问一个新的页面 ...
- ACM__并查集
并查集是树型的数据结构,处理不想交集合 主要解决查找和合并的问题 步骤: 初始化 把每个点所在的集合初始化为自身 复杂度为O(N) 查找 查找元素所在的集合,即根节点 合并 将两个元素所在的集合合并在 ...
- 2.Servlet基础.md
目录 1.定义 2.特点 3.手动编写一个Servlet 3.1创建一个Servlet类 3.2找到编写类的class文件,将这个类的整个包拷贝到一个web应用中的WEB-INF/classes目录下 ...
- JAVAWEB 一一 fmt标签 和日期插件
fmt标签 效果 操作: ①导入标签 <%@ taglib uri=httpjava.sun.comjspjstlfmt prefix=fmt %> ②标签这么写 <td>& ...
- workerman Channel组件全局广播
<?phpuse Workerman\Worker; require_once '../../web/Workerman/Autoloader.php';require_once '../../ ...
- tomcat支持 https
首先 安装nginx ,在nginx.conf 中引入 include /app/conf/nginx/vhosts/*.conf; 配置 并在conf/vhosts 目录 中配置virtual.c ...
- 常见异常代码oracle
exception oracle error sqlcode value condition no_data_found ora-01403 +100 select into 语句没有符合条件的记录返 ...
- centos下send-mail出错
当在脚本中执行发邮件操作得时候出现以下错误:send-mail: fatal: parameter inet_interfaces: no local interface found for ::1 ...
- zxing解析带logo二维码会报com.google.zxing.NotFoundException
参考原文:https://blog.csdn.net/cyl1226541/article/details/70557232 //复杂模式,开启PURE_BARCODE模式(☆☆☆) HINTS.pu ...