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})