一、CRM框架
二、跟进记录
可以在我的客户中查看客户的个人跟进记录,并且在forms中可以定义字段的限制。
forms.py
class ConsultRecordForm(forms.ModelForm):
class Meta:
model = models.ConsultRecord
exclude = ['delete_status']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
customer_choice = [(i.id, i) for i in self.instance.consultant.customers.all()]
customer_choice.insert(0, ('', '--------'))
# 限制客户是当前销售的私户
self.fields['customer'].widget.choices = customer_choice
# 限制跟进人是当前的用户(销售) self.instance是传进来的实例化对象
self.fields['consultant'].widget.choices = [(self.instance.consultant_id, self.instance.consultant), ]
views.py
# 跟进记录函数
class ConsultRecord(View):
def get(self, request, customer_id):
q = self.get_search_contion(['customer__name', 'note', 'status', 'consultant__username'])
print(q)
if customer_id == '0':
consult_obj = models.ConsultRecord.objects.filter(q, delete_status=False)
else: # 外键的customer的字段名为customer_id
consult_obj = models.ConsultRecord.objects.filter(q, customer_id=customer_id, delete_status=False)
query_params = copy.deepcopy(request.GET)
len_obj = len(consult_obj)
page_obj = pagination.Page(request, len_obj, query_params)
pre = page_obj.pre()
next = page_obj.next()
html_str = page_obj.get_html # 使用了装饰器
query_params = self.add_record()
return render(request, 'crm/consult_list.html',
context={"consult_obj": consult_obj[pre:next], "html_str": html_str, "len_obj": len_obj,
"query_params": query_params})
三、报名记录实现
通过前端传递的customer_id去查询当前客户的报名状态
class EnrolmentList(View):
def get(self, request, customer_id):
q = self.get_search_contion(['why_us', 'your_expectation', 'enrolled_date', 'customer__name'])
if customer_id == '0':
enrolment_obj = models.Enrollment.objects.filter(q, delete_status=False)
else:
enrolment_obj = models.Enrollment.objects.filter(q, customer_id=customer_id, delete_status=False)
forms.py
class EnrollmentForm(forms.ModelForm):
class Meta:
model = models.Enrollment
exclude = ['delete_status', 'contract_approved']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# # 限制当前的客户只能是传的id对应的客户
self.fields['customer'].widget.choices = [(self.instance.customer_id, self.instance.customer), ]
# # 限制当前可报名的班级是当前客户的意向班级
self.fields['enrolment_class'].widget.choices = [(i.id, i) for i in self.instance.customer.class_list.all()]
四、班级层级管理
1.班级管理
获取班级信息,实现班级的增删编辑功能
models中teacher字段使用函数时,前端直接调用此函数即可
def show_teachers(self):
return "|".join([str(i) for i in self.teachers.all()])
2.课程管理与批量添加学习记录
批量的将此节课程的记录添加到此班级的所有学生名下
# 课程信息
class CourseList(View):
def get(self, request, class_id):
course_obj = models.CourseRecord.objects.filter(re_class_id=class_id)
return render(request, 'crm/course_list.html', context={"course_obj": course_obj})
def post(self, request, class_id): # 当url中有参数时,post也需要传递相同的参数class_id
print(request.path_info)
action = request.POST.get('action')
# action = request.GET
if action:
print(action)
ret = getattr(self, action)(request)
print(ret)
return self.get(request, class_id)
else:
return HttpResponse("非法操作")
def multi_delte(self, request):
id_list = request.POST.getlist('id')
obj = models.CourseRecord.objects.filter(id__in=id_list).delete()
return "删除成功"
def multi_init(self, request):
# 根据当前提交的课程记录Id批量初识化学生的学习记录
course_ids = self.request.POST.getlist('id')
course_obj_list = models.CourseRecord.objects.filter(id__in=course_ids)
for course_obj in course_obj_list:
# 查询当前课程记录代表的班级的学生
all_students = course_obj.re_class.customer_set.filter(status='studying')
# print(all_students)
student_list = []
for student in all_students:
# models.StudyRecord.objects.create(course_record=course_obj, student=student)
# obj = models.StudyRecord(course_record=course_obj, student=student)
# obj.save()
student_list.append(models.StudyRecord(course_record=course_obj, student=student))
models.StudyRecord.objects.bulk_create(student_list) #批量存储数据时使用bulk_create方法
3.学习管理
展示所有学生的上课记录,并可以进行批量的修改和保存
views;py
from django.forms import modelformset_factory
#第一个参数为models,第二个参数为modelForm,extra参数为额外的空行
def study_record(request, course_id):
print(course_id)
FormSet = modelformset_factory(models.StudyRecord, StudyRecordForm, extra=0)
queryset = models.StudyRecord.objects.filter(course_record_id=course_id)
form_set = FormSet(queryset=queryset) #指定传递参数的位置
if request.method == 'POST':
form_set = FormSet(request.POST)
if form_set.is_valid():
form_set.save()
return redirect(reverse('study_list', args=(course_id,)))
return render(request, 'crm/study_list.html', {"form_set": form_set})
当批量传递数据时,前端页面一定要定义两个参数:
{{ form_set.management_form }}
{{ study.id }}
{% extends 'crm/layout.html' %}
{% block css %}
<style>
th, tr {
text-align: center;
}
</style>
{% endblock%}
{% block content %}
<div>
<form action="" class="form-inline pull-right" method="get">
<input type="text" name="query" class="form-control">
<button class="btn btn-sm btn-primary">搜索 <i class="fa fa-search"></i></button>
</form>
</div>
<form action="" method="post" class="form-inline">
{% csrf_token %}
{{ form_set.management_form }}
<table class="table table-condensed table-hover table-bordered">
<thead>
<tr>
<th>序号</th>
<th>学生姓名</th>
<th>考勤</th>
<th>成绩</th>
<th>批语</th>
</tr>
</thead>
<tbody>
{% for study in form_set %}
<tr>
{{ study.id }}
<td style="display: none">{{ study.student }}</td>
<!-- 不显示但需要student的数据-->
<td>{{ forloop.counter }}</td>
<td>{{ study.instance.student.name }}</td>
<!-- 需要显示,但不需要选择-->
<td>{{ study.attendance }}</td>
<td>{{ study.score }}</td>
<td>{{ study.homework_note }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<button class="btn btn-success btn-sm">保存</button>
</form>
<!--{{ form_set.errors }} 查看error信息-->
<nav aria-label="Page navigation">
<ul class="pagination">
<!-- {% for page in pagination %}-->
<!-- <li><a href="/crm/page/?page={{ page }}">{{ page }}</a></li>-->
<!-- {% endfor %}-->
{{ html_str }}
</ul>
</nav>
</div>
<div style="position:fixed;color:grey;bottom:30px;right:30px;"><p>符合条件的数据有 {{ len_obj }} 条</p>
</div>
{% endblock %}
功能效果