Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #urls.py 2 3 """PerfectCRM URL Configuration 4 5 The `urlpatterns` list routes URLs to views. For more information please see: 6 https://docs.djangoproject.com/en/2.0/topics/http/urls/ 7 Examples: 8 Function views 9 1. Add an import: from my_app import views 10 2. Add a URL to urlpatterns: path('', views.home, name='home') 11 Class-based views 12 1. Add an import: from other_app.views import Home 13 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 14 Including another URLconf 15 1. Import the include() function: from django.urls import include, path 16 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 17 """ 18 from django.contrib import admin 19 from django.urls import path 20 21 # ————————02PerfectCRM创建ADMIN页面———————— 22 from django.conf.urls import url # URL 23 from django.conf.urls import include # 分发URL 24 # ————————02PerfectCRM创建ADMIN页面———————— 25 26 # ————————46PerfectCRM实现登陆后页面才能访问———————— 27 from PerfectCRM import main_views 28 # ————————46PerfectCRM实现登陆后页面才能访问———————— 29 30 urlpatterns = [ 31 path('admin/', admin.site.urls), 32 33 # ————————02PerfectCRM创建ADMIN页面———————— 34 url(r'^king_admin/', include("king_admin.king_urls")), # 自定义admin 35 # ————————02PerfectCRM创建ADMIN页面———————— 36 37 # ————————03PerfectCRM创建基本数据———————— 38 url(r'^DBadd/', include("DBadd.DBadd_urls")), # 添加随机数据 39 # ————————03PerfectCRM创建基本数据———————— 40 # ————————38PerfectCRM实现全局账号登录注销———————— 41 url(r'^gbacc/', include("gbacc.gbacc_urls")), # 全局账号登录注销 42 # ————————38PerfectCRM实现全局账号登录注销———————— 43 44 # ————————42PerfectCRM实现AJAX全局账号注册———————— 45 url(r'^gbacc/', include("gbacc.gbacc_ajax_urls")), # 全局账号登录注销 46 # ————————42PerfectCRM实现AJAX全局账号注册———————— 47 48 # ————————46PerfectCRM实现登陆后页面才能访问———————— 49 url(r'^$', main_views.PortalView.as_view()), 50 # ————————46PerfectCRM实现登陆后页面才能访问———————— 51 52 # ————————47PerfectCRM实现CRM客户报名流程———————— 53 url(r'^bpm/', include("bpm.sales.sales_urls")), # 业务流程 #学生报名 54 # ————————47PerfectCRM实现CRM客户报名流程———————— 55 56 # ————————53PerfectCRM实现CRM客户报名流程缴费———————— 57 url(r'^bpm/', include("bpm.financial.financial_urls")), # 业务流程 #财务缴费 58 # ————————53PerfectCRM实现CRM客户报名流程缴费———————— 59 60 # ————————60PerfectCRM实现CRM学生上课记录———————— 61 url( r'^bpm/', include( "bpm.student.student_urls" ) ), # 业务流程 # 学生上课记录 62 # ————————60PerfectCRM实现CRM学生上课记录———————— 63 64 # ————————62PerfectCRM实现CRM讲师讲课记录———————— 65 url( r'^bpm/', include( "bpm.teacher.teacher_urls" ) ), # 业务流程 # 讲师班级 66 # ————————62PerfectCRM实现CRM讲师讲课记录———————— 67 ]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # teacher_urls.py 2 # ————————62PerfectCRM实现CRM讲师讲课记录———————— 3 from django.conf.urls import url 4 from bpm.teacher import teacher_views 5 urlpatterns = [ 6 url(r'^teacher_class/$', teacher_views.teacher_class,name='teacher_class'),#讲师班级 7 url(r'^teacher_class_detail/(\d+)/$', teacher_views.teacher_class_detail, name='teacher_class_detail'), # 讲师班级课节详情 8 9 ] 10 11 # ————————62PerfectCRM实现CRM讲师讲课记录————————
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # teacher_views.py 2 # ————————62PerfectCRM实现CRM讲师讲课记录———————— 3 from django.contrib.auth.decorators import login_required # 登陆后页面才能访问 4 from django.shortcuts import render 5 6 #讲师班级 7 @login_required # 登陆后页面才能访问 8 def teacher_class(request): 9 # user_id=request.user.id #当前登陆的ID 10 # classlist=models.UserProfile.objects.get(id=user_id).classlist_set.all()#讲师所教班级 11 classes_obj=request.user.classlist_set.all() #根据 登陆的ID 获取02班级表 12 return render(request,'bpm_teacher/teacher_class.html',locals()) 13 14 # 讲师班级课节详情 15 @login_required # 登陆后页面才能访问 16 def teacher_class_detail(request,class_id): 17 # user_id=request.user.id #当前登陆的ID 18 # classes_obj=models.UserProfile.objects.get(id=user_id).classlist_set.get(id=class_id)#所选的班级 19 classes_obj=request.user.classlist_set.get(id=class_id) #根据 登陆的ID 获取02班级表 20 courserecordlist=classes_obj.courserecord_set.all()#根据 02班级表的ID 获取09学习纪录 21 return render(request, 'bpm_teacher/teacher_classes_detail.html', locals()) 22 23 # ————————62PerfectCRM实现CRM讲师讲课记录————————
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # kingadmin.py 2 # ————————04PerfectCRM实现King_admin注册功能———————— 3 from crm import models 4 #print("kingadmin crm",models.Customer) 5 6 # ————————05PerfectCRM实现King_admin注册功能获取内存———————— 7 # from king_admin.base_admin import register,BaseAdmin 8 from king_admin.base_admin import site,BaseAdmin 9 # ————————05PerfectCRM实现King_admin注册功能获取内存———————— 10 11 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 12 from django.shortcuts import render 13 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 14 15 # ————————28PerfectCRM实现King_admin编辑限制———————— 16 from django.forms import ValidationError 17 from django.shortcuts import render,redirect 18 # ————————28PerfectCRM实现King_admin编辑限制———————— 19 20 21 22 23 # ————————62PerfectCRM实现CRM讲师讲课记录———————— 24 # 02班级表 25 class ClassListAdmin(BaseAdmin): 26 list_display = ['id', 'branch', 'course', 'class_type', 'semester', 'start_date', 'end_date'] # 显示字段表头 27 list_filter = ['branch', 'course', 'class_type'] # 过滤器(可以包含ManyToManyField) (注意加 逗号 , ) 28 filter_horizontal = ['teachers'] #复选框 29 site.register(models.ClassList,ClassListAdmin) #02班级表 30 31 # ————————62PerfectCRM实现CRM讲师讲课记录———————— 32 33 34 35 36 #04客户信息表 37 class CustomerAdmin(BaseAdmin):#定制Djanago admin 38 # ————————54PerfectCRM实现CRM客户报名链接———————— 39 # list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date') # 显示字段表头 40 list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date','status','enroll') # 显示字段表头 41 # ————————54PerfectCRM实现CRM客户报名链接———————— 42 # ————————11PerfectCRM实现King_admin分页显示条数———————— 43 list_per_page = 2 #分页条数 # 默认分页条数10 44 # ————————11PerfectCRM实现King_admin分页显示条数———————— 45 # ————————16PerfectCRM实现King_admin日期过滤———————— 46 # ————————15PerfectCRM实现King_admin多条件过滤———————— 47 # 过滤器(可以包含ManyToManyField) (注意加 逗号 , ) 48 # list_filter = ('source','consultant','consult_courses',) 49 list_filter = ('date','source','consultant','consult_courses',) 50 # ————————15PerfectCRM实现King_admin多条件过滤———————— 51 # ————————16PerfectCRM实现King_admin日期过滤———————— 52 # ————————18PerfectCRM实现King_admin搜索关键字———————— 53 #搜索(不能包含CharField)(注意加 逗号 , ) 54 search_fields = ('name','qq',) 55 # ————————18PerfectCRM实现King_admin搜索关键字———————— 56 # ————————26PerfectCRM实现King_admin自定义排序———————— 57 ordering = '-qq' #自定义排序,默认'-id' 58 # ————————26PerfectCRM实现King_admin自定义排序———————— 59 # ————————27PerfectCRM实现King_admin编辑复选框———————— 60 filter_horizontal = ('tags',) #复选框 61 # ————————27PerfectCRM实现King_admin编辑复选框———————— 62 # ————————33PerfectCRM实现King_admin编辑整张表限制———————— 63 readonly_table=True#默认表单不锁定 64 # ————————33PerfectCRM实现King_admin编辑整张表限制———————— 65 66 # ————————55PerfectCRM实现CRM客户报名状态颜色变化———————— 67 colored_fields = { 68 'status':{'已报名':"rgba(145, 255, 0, 0.78)", 69 '未报名':"#ddd"},} 70 # ————————55PerfectCRM实现CRM客户报名状态颜色变化———————— 71 72 # ————————54PerfectCRM实现CRM客户报名链接———————— 73 def enroll(self): 74 '''报名''' 75 print("customize field enroll",self) 76 link_name = "报名" 77 if self.instance.status == 0: 78 link_name = "报名新课程" 79 return '''<a target="_blank" class="btn-link" href="/bpm/customer/%s/enrollment/">点击%s</a> ''' % (self.instance.id,link_name) 80 # url(r'^customer/(\d+)/enrollment/$', sales_views.enrollment, name="enrollment"), # 客户招生#报名流程一 下一步 81 # target属性用于表示所链接文件打开到的位置 #记住,“”内的文字只是表示一个对象的名子。 82 enroll.display_name = "报名链接" 83 # ————————54PerfectCRM实现CRM客户报名链接———————— 84 85 86 87 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 88 # from django.shortcuts import render 89 actions = ['test_actions',]#定制功能 #测试返回到一个新页面 90 def test_actions(self,request,arg2):#对应的函数 #request类自己的请求 #arg2类的内容 91 return render(request,"king_admin/table_index.html") 92 test_actions.short_description = "测试显示中文" 93 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 94 95 # ————————28PerfectCRM实现King_admin编辑限制———————— 96 # ————————31PerfectCRM实现King_admin编辑多对多限制———————— 97 # readonly_fields = ('qq', 'consultant',) # 不可修改 98 readonly_fields = ('qq', 'consultant','tags',) # 不可修改 99 # ————————31PerfectCRM实现King_admin编辑多对多限制———————— 100 101 # ————————29PerfectCRM实现King_admin编辑自定义限制———————— 102 def default_form_validation(self,obj): 103 print('validation:制定的',obj.cleaned_data) 104 consult_course=obj.cleaned_data.get('content','')#自制验证字段 105 if len(consult_course)<10: 106 return ValidationError(#添加错误信息 返回 107 ("该字段%(field)s 咨询内容记录不能少于10个字符"), 108 code='invalid', 109 params={'field':'content',}, 110 ) 111 # ————————29PerfectCRM实现King_admin编辑自定义限制———————— 112 113 # ————————28PerfectCRM实现King_admin编辑限制———————— 114 115 # ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— 116 def clean_name(self,obj,*args,**kwargs):#名称验证 单个 117 name=obj.cleaned_data['name'] 118 if not name: 119 obj.add_error('name','不能为空!') 120 return ValidationError(#添加错误信息 返回 121 ("%(field)s:该字段 不能为空"), 122 code='invalid', 123 params={'field':'name',}, 124 ) 125 elif len(name)<5: 126 obj.add_error('name','不能小于5个字符!') 127 #return ValidationError('',) 128 return ValidationError(#添加错误信息 返回 129 ("%(field)s:该字段 不能小于5个字符!"), 130 code='invalid', 131 params={'field':'name',}, 132 ) 133 # ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— 134 135 # ————————34PerfectCRM实现CRM自定义用户———————— 136 #10账号表 137 class UserProfileAdmin(BaseAdmin):#定制Djanago admin 138 list_display = ('id', 'email', 'name') # 显示字段表头 139 140 # ————————36PerfectCRM实现King_admin密码修改———————— 141 readonly_fields = ('password',) # 不可修改,限制 142 filter_horizontal = ('user_permissions','groups') #复选框 143 modelform_exclude_fields=['last_login']#排除#不显示 #自增日期 #base_admin.py #forms.py 144 # ————————36PerfectCRM实现King_admin密码修改———————— 145 146 site.register(models.UserProfile, UserProfileAdmin) 147 # ————————34PerfectCRM实现CRM自定义用户———————— 148 149 # ————————05PerfectCRM实现King_admin注册功能获取内存———————— 150 # register(models.Customer,CustomerAdmin) 151 # register(models.CourseRecord) 152 site.register(models.Customer,CustomerAdmin) 153 # ————————58PerfectCRM实现king_admin批量生成上课记录———————— 154 # site.register(models.CourseRecord) 155 # ————————58PerfectCRM实现king_admin批量生成上课记录———————— 156 # ————————05PerfectCRM实现King_admin注册功能获取内存———————— 157 158 # ————————04PerfectCRM实现King_admin注册功能———————— 159 160 161 # ————————56PerfectCRM实现CRM客户报名缴费链接———————— 162 # 06学员报名信息表 163 class EnrollmentAdmin(BaseAdmin): # 定制Djanago admin 164 list_display = ('id', 'customer', 'enrolled_class', 'consultant', 'Pay_cost', 'date', 'payment') # 显示字段表头 165 166 # ————————58PerfectCRM实现king_admin批量生成上课记录———————— 167 list_filter = ('enrolled_class','consultant', 'Pay_cost',) # 过滤器(可以包含ManyToManyField) (注意加 逗号 , ) 168 # ————————58PerfectCRM实现king_admin批量生成上课记录———————— 169 170 colored_fields = { 171 'Pay_cost': {True: "rgba(145, 255, 0, 0.78)", 172 False: "#ddd"}, } 173 def payment(self): 174 link_name = "增加缴费" 175 if self.instance.Pay_cost == False: 176 link_name = "缴费" 177 return '''<a target="_blank" class="btn-link" href="/bpm/payment/%s/" >点击%s</a> ''' % (self.instance.id, link_name) 178 # url(r'^payment/(\d+)/$', financial_views.payment, name="payment"), # 报名流程四 缴费 #财务 179 # target属性用于表示所链接文件打开到的位置 #记住,“”内的文字只是表示一个对象的名子。 180 payment.display_name = "缴费链接" 181 site.register(models.Enrollment, EnrollmentAdmin) # 06学员报名信息表 182 # ————————56PerfectCRM实现CRM客户报名缴费链接———————— 183 184 # ————————58PerfectCRM实现king_admin批量生成上课记录———————— 185 # 07缴费记录表 186 class PaymentAdmin(BaseAdmin): 187 list_display = ['id', 'customer', 'course', 'amount', 'consultant','date'] # 显示字段表头 188 list_filter = ('customer', 'course', 'consultant',) # 过滤器(可以包含ManyToManyField) (注意加 逗号 , ) 189 190 from django.shortcuts import render, HttpResponse, redirect 191 # 08每节课上课纪录表 192 class CourseRecordAdmin(BaseAdmin): 193 list_display = ['id', 'from_class', 'day_num', 'teacher', 'has_homework', 'homework_title', 'homework_content','outline', 'date'] # 显示字段表头 194 list_filter = ('from_class', 'teacher', 'date') # 过滤器(可以包含ManyToManyField) (注意加 逗号 , ) 195 def initialize_studyrecords(self, request, queryset): # 制定功能 196 print('initialize_studyrecords', self, request, queryset) 197 if len(queryset) > 1: 198 return HttpResponse("同时只能选择一个班级!") 199 print('获取对应的学员', queryset[0].from_class.enrollment_set.all()) # _set反向查询 200 new_obj_list = [] # 用于批量创建事务 #防止数据库事物回滚 201 for enrll_obj in queryset[0].from_class.enrollment_set.all(): # 创建学习记录 202 # models.StudyRecord.objects.get_or_create( #get_or_ #防止报错 203 # student=enrll_obj,#对应学员 204 # course_record=queryset[0], 205 # attendance=0,#签到状态,默认签到, 206 # score=0,#成绩 207 # ) 208 209 # 防止数据库事物回滚 #"""09学习纪录""" 210 new_obj_list.append(models.StudyRecord( 211 student=enrll_obj, # 对应学员 212 course_record=queryset[0], # 班级#节课 213 attendance=0, # 签到状态,默认签到, 214 score=0, # 成绩 215 )) 216 try: 217 models.StudyRecord.objects.bulk_create(new_obj_list) # bulk_create批量创建数据库事物 #统一最后保存 218 except Exception as e: 219 return HttpResponse('批量创建失败,本节课可能有相应的上课记录') 220 221 return redirect("/king_admin/crm/studyrecord/?course_record=%s" % queryset[0].id) # 学习记录 #加上过滤 222 223 actions = ['initialize_studyrecords', ] 224 initialize_studyrecords.short_description = "创建班级本节上课记录" # 显示别名 225 # 09学习纪录 226 class StudyRecordAdmin(BaseAdmin): 227 list_display = ['id', 'student', 'course_record', 'attendance', 'score', 'date'] # 显示字段表头 228 229 list_filter = ['course_record', 'attendance', 'score', 'student'] # 过滤器(可以包含ManyToManyField) (注意加 逗号 , ) 230 231 list_editable = ['score', 'attendance'] # 可编辑 #用于上课点名 批改成绩 232 233 site.register(models.Payment, PaymentAdmin) # 07缴费记录表 234 site.register(models.CourseRecord, CourseRecordAdmin) # 08每节课上课纪录表 235 site.register(models.StudyRecord, StudyRecordAdmin) # 09学习纪录 236 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 {#teacher_class.html#} 2 {## ————————62PerfectCRM实现CRM讲师讲课记录————————#} 3 {% extends 'bpm_master/bpm_sample.html' %} 4 {% block right-container-content %} {#自定义内容开始 右边页面内容#} 5 <div class="panel-default"> 6 <div class="panel-body"> 7 <h4>当前用户: {{ request.user }} | 讲师名字:{{ request.user.stu_account.name }} | 8 讲师QQ:{{ request.user.stu_account }}</h4> 9 <ol class="breadcrumb"> 10 <li><a href="/bpm/teacher_class/">我的班级</a></li> 11 </ol> 12 <table class="table table-striped table-responsive"> 13 <thead> 14 <tr> 15 <th><a target="_blank" href="/king_admin/crm/classlist/add/">校区班级</a></th> 16 <th>班级类型</th> 17 <th><a target="_blank" href="/king_admin/crm/courserecord/add/">课程进度</a></th> 18 <th><a target="_blank" href="/king_admin/crm/customer/">学员数量</a></th> 19 <th>开课日期</th> 20 <th>结业日期</th> 21 </tr> 22 </thead> 23 <tbody> 24 {% for class in classes_obj %} 25 <tr> 26 <td>{{ class }}</td> 27 <td>{{ class.get_class_type_display }}</td> 28 <td> 29 <a href="{% url 'teacher_class_detail' class.id %}"> 30 已上: {{ class.courserecord_set.all.count }}节 31 </a> 32 </td> 33 <td>{{ class.enrollment_set.select_related.count }}</td> 34 <td>{{ class.start_date }}</td> 35 <td>{{ class.end_date }}</td> 36 </tr> 37 {% endfor %} 38 </tbody> 39 </table> 40 </div> 41 </div> 42 {% endblock %} 43 {## ————————62PerfectCRM实现CRM讲师讲课记录————————#}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 {#teacher_classes_detail.html#} 2 {## ————————62PerfectCRM实现CRM讲师讲课记录————————#} 3 {% extends 'bpm_master/bpm_sample.html' %} 4 {% block right-container-content %} {#自定义内容开始 右边页面内容#} 5 <div class="panel-default"> 6 <div class="panel-default"> 7 <div class="panel-body"> 8 <h4>当前用户: {{ request.user }} | 讲师名字:{{ request.user.stu_account.name }} | 9 讲师QQ:{{ request.user.stu_account }} </h4> 10 <ol class="breadcrumb"> 11 <li><a href="/bpm/teacher_class/">我的班级</a></li> 12 <li><a href="{% url 'teacher_class_detail' classes_obj.id %}">{{ classes_obj }}</a></li> 13 </ol> 14 <table class="table table-striped table-responsive "> 15 <thead> 16 <tr> 17 <th><a target="_blank" href="/king_admin/crm/courserecord/add/">课程节次</a></th> 18 <th>签到状态</th> 19 <th>本节作业</th> 20 <th>上课日期</th> 21 <th>本节大纲</th> 22 <th>作业标题</th> 23 <th>作业要求</th> 24 </tr> 25 </thead> 26 27 28 <tbody> 29 {% for courserecord in courserecordlist %} 30 <tr> 31 <td><a target="_blank" 32 href="/king_admin/crm/courserecord/{{ courserecord.id }}/change/">第 {{ courserecord.day_num }}节</a> 33 </td> 34 {#课程节次#} 35 <td> 36 <a target="_blank" 37 href="/king_admin/crm/studyrecord/?course_record={{ courserecord.id }} ">点名/成绩</a> 38 </td> 39 {#签到状态#} 40 <td>{{ courserecord.has_homework }}</td> 41 {#本节作业#} 42 <td> {{ courserecord.date }}</td> 43 {#上课日期#} 44 <td> 45 <pre style="width: 240px;height: 60px">{{ courserecord.outline }} </pre> 46 </td> 47 {#本节大纲#} 48 <td> 49 <pre style="width: 240px;height: 60px">{{ courserecord.homework_title }}</pre> 50 </td> 51 {#作业标题#} 52 <td> 53 <pre style="width: 240px;height: 60px">{{ courserecord.homework_content }} </pre> 54 </td> 55 {#作业要求#} 56 </tr> 57 {% endfor %} 58 </tbody> 59 </table> 60 </div> 61 </div> 62 </div> 63 {% endblock %} 64 {## ————————62PerfectCRM实现CRM讲师讲课记录————————#}
![](https://files.cnblogs.com/files/ujq3/wxzf.gif)
您的资助是我最大的动力!
金额随意,欢迎来赏!
![](https://files.cnblogs.com/files/ujq3/zfbzf.gif)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【颜言】!