### 12. CRM项目 1.项目需求 cunstomer relationship managemennt 客户关系管理系统 1. 注册 2. 登录 3. 销售: 1. 客户信息的管理 1. 展示 2. 新增 3. 编辑 4. 删除 2. 跟进记录管理 1. 展示 2. 新增 3. 编辑 4. 删除 3. 报名记录的管理 1. 展示 2. 新增 3. 编辑 4. 删除 4. 缴费记录的管理 1. 展示 2. 新增 3. 编辑 4. 删除 4.表结构 1. 用户表 2. 客户表 3. 跟进记录表 4. 报名记录表 5. 缴费记录表 6. 班级表 7. 课程记录表 8. 学习记录表 ```python class RegForm(forms.Form): username = forms.CharField( min_length = 6, max_length = 32, label = '用户名', initial = '初始值', error_messages = { 'required':'必填', 'min_length':'最小长度', 'invalid':'' }, validators = [], widget = forms.TextInput(attrs = {''}) ) gender = forms.ChoiceField(choices=[(1,'男'),(2,'女')]) def clean_username(self): pass #校验成功 返回该字段的值 #校验不成功 抛出异常 def clean(self): pass #校验成功 返回所有的值 #校验不成功 抛出异常 #self.add_error(filed,error) class RegForm(forms.ModelForm): password = forms.CharField(min_length=6, widget = forms.Passwordput(attrs={'placeholder':'您的密码','autocomplete':'off'})) re_password = forms.CharField(min_lenth=6, widget=forms.PasswordInput(attrs={'placeholder':'您的密码','autocomplete':'off'})) class Meta: model = models.UserProfile fields = '__all__' #表示所有,但是也可以用['username',] 表示其中的部分字段 exclude = ['is_active'] labels = {'username':'用户名'} widgets = { 'username':forms.EmailInput(attrs={ 'placeholder':'您的用户名','autocomplete':'off',}), 'mobile':forms.TextInput(attrs=[ 'placeholder';'您的手机号','autocomplete':'off',]) 'name':forms.TextInput(attrs= 'placeholder':'您的真实姓名','autocomplete':'off') } error_messages = { 'username':{ 'required':'必填', 'invalid':'邮箱格式不正确' } } def clean(self): password = self.clean_data.get('password','') re_password = self.cleaned_data.get('re_password','') if password = re_password: #对密码进行加密 md5 = haslib.md5() md5.update(password.encode('utf-8')) self.clean_data['password'] = md5.hexdigest() return self.cleaned_data else: self.add_error('re_password','两次密码不一致') raise ValidationError('两次密码不一致') ``` #### 12.1 获取字段的方式 1.展示客户信息 获取普通的字段:对象.字段名 获取有choice参数: 对象.字段名 ————》数据库的数据 '对象.get_字段名_display()' ————数据库的数据对应的中文提示 外键获取: 对象.外键 ————》 外键对象 定义_str_ 对象.外键.字段 自定义方法: 多对多: ```python def show_class(self): return ''.join([str(i) for i in self.class_list.all()]) ``` 自定义的需求 ```python def show_status(self): color_dict = { 'signed':'green', 'unregistered':'red', 'studying':'blue', 'paid_in_full':'gold' } return mark_safe( '<span style= "color:white;background:{};padding:5px">{}</span>'.format(color_dict.get(self.status),self.get_status_display())) ```