zoukankan      html  css  js  c++  java
  • Django--CRM

    一 . 什么是CRM

      CRM就是客户关系管理系统(customer relationship management)

    二 . 用户登录

    # models.py文件
    class UserProfile(models.Model):
       
        username = models.EmailField(max_length=255, unique=True, )
        password = models.CharField(verbose_name='密码', max_length=128, )
        name = models.CharField('名字', max_length=32)
        department = models.ForeignKey('Department', default=None, blank=True, null=True, verbose_name='部门')
        mobile = models.CharField('手机', max_length=32, default=None, blank=True, null=True)
        memo = models.TextField('备注', blank=True, null=True, default=None)
        date_joined = models.DateTimeField(auto_now_add=True)
        is_active = models.BooleanField(default=True)
        # 管理员看他是否离职,如果离职则改为False,只有账号密码都正确并且is_active=True

      可以去网站上扒好看的登录页面

        步骤一(找到你想要的模型)  

      

        步骤二(查看源代码)

      

        步骤三(找到css样式)

      

        步骤四(在HTML文件中的body部分把路径修改一下)

        步骤五(查看效果)

    三 . 注册验证

    # views.py文件,也可以单独在APP下建议个py文件写
    
    from django import forms
    from crm import models
    from django.core.exceptions import ValidationError
    import hashlib
    
    class RegForm(forms.ModelForm):
        # Meta里面的内容不满足你的验证要求,可以在Meta外面写,
        password = forms.CharField(
            widget=forms.PasswordInput,
            label='密码',
            min_length=6,
            max_length=16,
            # 这个字段的报错信息也只写在这里才生效
            error_messages={'min_length': '不能小于6位'}
        )
        re_password = forms.CharField(widget=forms.PasswordInput, label='确认密码', min_length=6, max_length=16)
    
        class Meta:  # 类名只能是Meta  而且下面的字段名都不能改
    
            model = models.UserProfile  # 对应models中的类
            fields = '__all__'   # 拿到所有的字段
            # print(fields)
            exclude = ['is_active']   # 除了is_active这个字段
            labels = {
                'username': '用户名'   # 前边的那个label改成'用户名'
            }
            # 下面的报错信息不会生效,因为在Mata中写的只对默认生成的字段有效
            error_messages = {
                'required': '不能为空',
            }
        # 批量操作, 把所有的字段都加上class=form-control这个属性
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            for field in self.fields.values():
                print(self.fields.values())  # 所有字段对象组成的列表
                print('>>>>>', field)  # 每个字段对象
                field.widget.attrs.update({'class': 'form-control'})
                
        # 全局钩子,常用来验证两次密码输入是否正确
        def clean(self):
            pwd = self.cleaned_data.get('password', '')  # 不写空字符串会显示None, None不能encode
            # print(self.cleaned_data)
            re_pwd = self.cleaned_data.get('re_password', '')
            if pwd == re_pwd:
                # 密码加密
                md5 = hashlib.md5()
                md5.update(pwd.encode('utf-8'))
                pwd = md5.hexdigest()
                # 把加密后的密码改写到cleaned_data里面
                self.cleaned_data['password'] = pwd
                return self.cleaned_data
            self.add_error('re_password', '两次密码不一致')
            raise ValidationError('两次密码不一致')  # 这个全局的错误也必须写
    # views.py文件
    
    def register(request):
        if request.method == 'GET':
            form_obj = RegForm()
            return render(request, 'register.html', {'form_obj': form_obj})
        else:
            form_obj = RegForm(request.POST)
            # 对数据库进行校验
            if form_obj.is_valid():
                form_obj.save()  # 把你提供的数据按照相应的位置插进去,有就插,没有就不插
                return HttpResponse('ok')
                # return redirect('login')
            return render(request, 'register.html', {'form_obj': form_obj})
    
    # 前端标签中label中for要写form_obj.字段名.id_for_label 这样就可以了
  • 相关阅读:
    C#调用默认浏览器打开网页的几种方法
    关于百度排名点击器作弊提升百度排名的说明
    网站被百度降权的各种原因大解析
    百度搜索引擎排名原理、因素
    【ASP.NET开发】获取客户端IP地址 via C#
    防抖和节流
    vuex
    watch 和 computed
    JavaScript捕获与冒泡与委托
    XSS攻击
  • 原文地址:https://www.cnblogs.com/attila/p/10520075.html
Copyright © 2011-2022 走看看