• Django之crm


    crm注册

    crm注册Form

    from django import forms
    from crm import models
    from django.core.exceptions import ValidationError
    
    
    # ModelForm的作用:做验证,生成form表单input框
    class BaseForm(forms.ModelForm):
        # 给所有的字段添加属性
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            for field in self.fields.values():
                field.widget.attrs.update({'class': 'form-control'})
    
    # 注册form
    class RegForm(BaseForm):
        password = forms.CharField(
            # input框前面提示语
            label='密码',
            # 注册的时候密码为密文
            widget=forms.widgets.PasswordInput(),
            # 最小长度为6
            min_length=6,    
            # 提示的错误信息
            error_messages={'min_length': '最小长度为6'}
        )
        re_password = forms.CharField(
            label='确认密码',
            # 注册的时候密码为密文
            widget=forms.widgets.PasswordInput()
        )
    
        class Meta:
            model = models.UserProfile
            # fields = '__all__'   # 所有字段
            fields = ['username', 'password', 're_password', 'name', 'department']  # 指定字段
            # exclude = ['']
            widgets = {
                # 给单个的字段添加属性,或者进行设置
                'username': forms.widgets.EmailInput(attrs={'class': 'form-control'}),
                'password': forms.widgets.PasswordInput,
            }
    
            # 能让字段在admin中用中文来显示----(和verbose_name作用一样)
            labels = {
                'username': '用户名',
                'password': '密码',
                'name': '姓名',
                'department': '部门',
            }
    
            # 提示错误信息,能给页面传递过去并展现出来
            error_messages = {
                'password': {
                    'required': '密码不能为空',
                }
            }
    
        # def __init__(self, *args, **kwargs):
        #     super().__init__(*args, **kwargs)
        #     for filed in self.fields.values():
        #         filed.widget.attrs.update({'class': 'form-control'})
    
        # ModelForm的作用:做验证,生成form表单(全局钩子--全局校验就是所有的字段校验一遍,然后再进行二次校验)
        def clean(self):
            pwd = self.cleaned_data.get('password')
            re_pwd = self.cleaned_data.get('re_password')
            if pwd == re_pwd:
                return self.cleaned_data
            self.add_error('re_password', '两次密码不一致')
            raise ValidationError('两次密码不一致')
    

    给字段添加属性的不同方式:

    for field in self.fields.values():
        field.widget.attrs.update({"class":"form-control"})
    
    
    for field in self.fields:
        self.fields[field].widget.attrs.update({"class":"form-control"})
    
    
    class Meta:
        model = models.Permission
        widgets = {
                "name":forms.widgets.EmailInput(attrs={"class":"form-control"})
    

     crm注册函数

    # 注册
    def register(request):
        # 实例化一个空的注册对象
        form_obj = RegForm()
        if request.method == 'POST':
            # 实例化一个带POST参数的注册对象
            form_obj = RegForm(request.POST)
            # 进行校验
            if form_obj.is_valid():
                # 创建新用户
                # 方法一
                # form_obj.cleaned_data.pop('re_password')
                # models.UserProfile.objects.create_user(**form_obj.cleaned_data)
    
                # 方法二
                obj = form_obj.save()
                obj.set_password(obj.password)
                obj.save()
                return redirect('/login/')
        return render(request, 'register.html', {'form_obj': form_obj})
    

     crm登录

    def login(request):
        err_msg = ''
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            # 把获取到的数据与数据库做校验
            obj = auth.authenticate(request, username=username, password=password)
            # 如果通过校验,则跳转
            if obj:
                # 记录登录的用户
                auth.login(request, obj)
                return redirect(reverse('consumer'))
            err_msg = '用户或密码错误'
        return render(request, 'login.html', {'err_msg': err_msg})
    

    crm之客户

    crm函数

    # 进行了深拷贝
    query_params = request.GET.copy()  # <QueryDict: {'query': ['alex']}>
    
    # query_params = request.GET  # <QueryDict: {'query': ['alex']}>
    
    # _mutable = True就可以修改,经过urlencode()后变为 # query=alex&page=1
    query_params._mutable = True
    
    
    query_params.urlencode() # 执行完可以得到以下结果
    # query_params['page'] = 1  # <QueryDict: {'query': ['alex'],'page': ['1']}>
    # query=alex&page=1
    
    # 判断是否存在这个操作
    if not hasattr(self, action):
       return HttpResponse('非法操作')
    # 通过反射来执行函数
    ret = getattr(self, action)()
    
    # 公户变私户
    def multi_pri(self):
        # 获取选择的数据的ID
        ids = self.request.POST.getlist('id')
        # 计算出想要放入私户中的个数
        pri_num = len(ids)
    
        # 用户总数不能超过设置值(在settings做了配置)
        if self.request.user.customers.count() + pri_num > settings.CUSTOMER_MAX_NUM:
           return HttpResponse('做人不要太贪心,给别人留点机会')
    
        # 方法一
        # models.Customer.objects.filter(id__in=ids).update(consultant=self.request.user)
        # 方法二(这里add中放的必须是对象)
        self.request.user.customers.add(*models.Customer.objects.filter(id__in=ids))
    
        # 事务:
        with transaction.atomic():
        # select_for_update 加锁(行级加锁)
        obj_list = models.Customer.objects.filter(id__in=ids, customer__isnull=True).select_for_update()
    
        # 如果想要加入的个数还等于获取的个数,则说明可以进行加入,否则就是其中有的已经被别人抢走了
        if pri_num == len(obj_list):
           obj_list.update(consultant=self.request.user)
        else:
           return HttpResponse('你手速太慢了,已经被别人抢走了。')
    
    # 查询条件函数
    def get_search_contion(self, query_list):
       # 从页面上获取query参数,如果没有的话,就默认为空
       query = self.request.GET.get('query', '')
       # 调用Q方法
       q = Q()
       q.connector = 'OR'  # 意思是Q中存放的条件之间为或者的关系
       # q.children.append(Q(('qq__contains', query)))
       # q.children.append(Q(('name__contains', query)))
       for i in query_list:
           q.children.append(Q(('{}__contains'.format(i), query)))
       return q
       # Q(Q(qq__contains=query) | Q(name__contains=query))
    

    crm新增和编辑客户

    # 新增和编辑客户
    def consumer(request, edit_id=None):
    
        # 新增时,获取的对象为空
        obj = models.Customer.objects.filter(id=edit_id).first()
    
        # 编辑时需要给传带数据的对象所以需要传instance=obj
        form_obj = ConsumerForm(instance=obj)
    
        if request.method == 'POST':
            # 此时传入的obj为编辑后的数据对象,而且Form中的参数位置不能颠倒
            form_obj = ConsumerForm(request.POST, instance=obj)
    
            # 对实例化后的对象进行校验
            if form_obj.is_valid():
                form_obj.save()
                # 获取到下一个跳转的地址next
                next = request.GET.get('next')
                # 如果next存在则跳转到next指向的地址
                if next:
                    return redirect(next)
                return redirect(reverse('consumer'))
        return render(request, 'crm/consumer.html', {'form_obj': form_obj, 'edit_id': edit_id})
    

    crm跟进记录

    # 因为必须要指定销售所以和其他的新增和编辑有区别
    obj = models.ConsultRecord.objects.filter(id=edit_id).first() or models.ConsultRecord(consultant=request.user)
    

    crm报名记录

    # 修改用户的状态(添加报名表后)
    enrollment_obj.customer.status = 'signed'
    enrollment_obj.customer.save()
    

    crm课程记录

    # 课程记录中的一个功能    
    def multi_init(self):
            # 根据当前提交的课程记录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')
    
                student_list = []
    
                for student in all_students:
                    student_list.append(models.StudyRecord(course_record=course_obj, student=student))
                # 批量创建对象
                models.StudyRecord.objects.bulk_create(student_list)
    

    crm学习记录

    from django.forms import modelformset_factory
    
    
    # 展示学习记录
    def studylist(request, course_id):
        # 生成Django的form表单在页面上能展示出来,能更好的进行编辑修改。extra默认为1
        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 render(request, 'crm/study_list.html', {'form_set': form_set})
    

  • 相关阅读:
    刚开发的游戏《天黑请闭眼》
    用手机控制服务器
    专业网站打包/解包asp工具(E文精装版本)!
    令我爱慕的女子(转自7di.net)
    8088 汇编速查手册
    Asp调用函数是否会影响性能?
    文档管理器
    ubuntu install xxx.deb
    Java线程池的原理及几类线程池的介绍
    ubuntu download file path
  • 原文地址:https://www.cnblogs.com/wjs521/p/9898357.html
Copyright © 2020-2023  润新知