第五十九篇 Django-CRM系统-3 跟进记录,报名记录,班级层级管理

一、CRM框架

gitHub地址
在这里插入图片描述

二、跟进记录

可以在我的客户中查看客户的个人跟进记录,并且在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>符合条件的数据有&nbsp{{ len_obj }}&nbsp条</p>
</div>
{% endblock %}


功能效果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值