• crm开发之用户ModelForm定制和密码加密


    写了这么多的定制 功能。终于可以定制一下了!
    因为是 stark 和 rbac 两个组建。 一起使用。 所以在这里,再记录一下。需要注意的点:

    先放出 目录结构:

    先从  stark 开始。
    使用stark组件,其实就是对, 自己 的 web 业务中的。 表进行增删改查。

    首先再  webapp 下面, 增加一个  stark 的py文件:

    from django import forms
    from django.core.exceptions import ValidationError
    from stark.servers.start_v1 import site, StartHandler, SearchGroupRow, get_choice_text, StarkModelForm
    from web import models
    from web.utils import pwdmd5
    
    
    class SchoolHandler(StartHandler):
        # list_display = ["title", StartHandler.display_edit, StartHandler.display_del]
        list_display = ["title"]
    
    
    class DepartmentHandler(StartHandler):
        list_display = ["title"]
    
    
    class UserInfoADDModelForm(StarkModelForm):
        '''定制用户添加 form。 增加一个 确认密码字段, 并且需要增加验证'''
        confirm_password = forms.CharField(label="确认密码")
    
        class Meta:
            model = models.UserInfo
            fields = ["name", "password", "confirm_password", "nickname", "gender", "telephone", "email", "depart", "roles"]
    
        def clean_confirm_password(self):
            password = self.cleaned_data.get("password")
            confirm_password = self.cleaned_data["confirm_password"]
            if password and confirm_password:
                if password != confirm_password:
                    raise ValidationError("两次密码输入不一致")
                return confirm_password  # 验证完成一定要返回,才能添加到 cleaned_data 字典中. 其他地方才能通过cleaned_data获取到
    
        def clean(self):
            '''对密码进行加密, 可以在clean 里面来做。'''
            password = self.cleaned_data["password"]
            self.cleaned_data["password"] = pwdmd5.creatr_md5(password)
            return self.cleaned_data
    
    
    class UserInfoEditModelForm(StarkModelForm):
        '''定制用户编辑 form。不显示密码字段。'''
        class Meta:
            model = models.UserInfo
            fields = ["name", "nickname", "gender", "telephone", "email", "depart", "roles"]
    
    
    class UserInfoHandler(StartHandler):
        list_display = ["name", "nickname", "age", get_choice_text("性别", "gender"), "telephone", "email", "depart", "roles"]
    
        def get_model_form_class(self, is_add=False):
            if is_add:
                return UserInfoADDModelForm
            return UserInfoEditModelForm
    
    
    site.register(models.School, SchoolHandler)
    site.register(models.Department, DepartmentHandler)
    site.register(models.UserInfo, UserInfoHandler)

    在这里,因为要使用 rbac 组件。 所以相应的  我的UserInfo 表。 是继承的 Rbac 组件中的UserInfo 表。
    所以  rbac 组件中的 userinfo 表。需要一点小小的,调整:

    class UserInfo(models.Model):
        name = models.CharField(verbose_name='用户名', max_length=32)
        password = models.CharField(verbose_name='密码', max_length=64)
        email = models.CharField(verbose_name='邮箱', max_length=32)
        roles = models.ManyToManyField(verbose_name='拥有的所有角色', to=Role, blank=True, null=True)
        # 一定要记住, 如果被继承了! 在别的地方创建关联关系的时候。 会在别的地方找 Role 这张表。
        # 但是 别的地方肯定是没有的, 所有 在指定关联表的时候,直接把表对象放进去 to=Role 不要再使用 to="Role"
        # 这样在继承的时候, 会连带这Role这张表的内存地址,一起继承过去。 否则,会报错。 说在你的业务中找不到 Role 这张表
    
        class Meta:
            # django以后再做数据库迁移的时候, 不再为UserInfo类,创建相关的表以及结构
            # 此类 可以当作 "父类", 被其他 model类继承。
            abstract = True
    

    ok 这就可以了!

    再来看一看定制方面的功能:
    需求:  添加用户时, 需要增加一个  确认密码的字段。  而编辑用户时, 密码字段不应该显示。
    实现:  自定义两个 form 类。 一个添加,一个删除。

    class UserInfoADDModelForm(StarkModelForm):
        '''定制用户添加 form。 增加一个 确认密码字段, 并且需要增加验证'''
        confirm_password = forms.CharField(label="确认密码")
    
        class Meta:
            model = models.UserInfo
            fields = ["name", "password", "confirm_password", "nickname", "gender", "telephone", "email", "depart", "roles"]
    
        def clean_confirm_password(self):
            password = self.cleaned_data.get("password")
            confirm_password = self.cleaned_data["confirm_password"]
            if password and confirm_password:
                if password != confirm_password:
                    raise ValidationError("两次密码输入不一致")
                return confirm_password  # 验证完成一定要返回,才能添加到 cleaned_data 字典中. 其他地方才能通过cleaned_data获取到
    
        def clean(self):
            '''对密码进行加密, 可以在clean 里面来做。'''
            password = self.cleaned_data["password"]
            self.cleaned_data["password"] = pwdmd5.creatr_md5(password)
            return self.cleaned_data

    添加的 form 类。 增加confirm_password 字段。   使用 clean_..... 对该密码进行验证。
    再全局 钩子clean中, 对密码进行加密。 因为只有前面的验证通过了, 才会走到这里。

    加密写的简单:瞎搞:

    import hashlib
    def creatr_md5(origin):
        # ha = hashlib.md5(b"asdasdasdasdasd")  # 也可以在这里进行加盐
        ha = hashlib.md5()  # 也可以在这里进行加盐
        ha.update(origin.encode("utf-8"))
        return ha.hexdigest()


    再来是编辑:

    class UserInfoEditModelForm(StarkModelForm):
        '''定制用户编辑 form。不显示密码字段。'''
        class Meta:
            model = models.UserInfo
            fields = ["name", "nickname", "gender", "telephone", "email", "depart", "roles"]

    只是少显示一个字段, 没啥好说的!

    自定制:

    class UserInfoHandler(StartHandler):
        list_display = ["name", "nickname", "age", get_choice_text("性别", "gender"), "telephone", "email", "depart", "roles"]
    
        def get_model_form_class(self, is_add=False):
            if is_add:
                return UserInfoADDModelForm
            return UserInfoEditModelForm

    重写StartHandler 基类中的  get_model_form_class()  方法。返回不同的值:
      此方法是,有 add视图函数, 和 rdit 视图函数进行调用的。
    再调用时, 传入参数, is_add=Ture  或者  is_add=False  拿到想要的 form 类。 就可以实现了!

    list_display 此列表作用于, 展示页面。 传几个字段,就展示几个字段的信息。

    其中的函数 get_choice_text("性别", "gender") 是一个使用,闭包完成的,展示 filed对象中, 有 choice 选项的, 让其显示中文的功能。

  • 相关阅读:
    codevs1127
    codevs1041
    C#预处理指令
    C#基本语句与C++区别
    iOS.TextKit.01.凸版印刷效果
    iOS.常用设计模式.02.委托模式
    iOS.常用设计模式.01.单例模式
    iOS.iPad.03.UIModal
    iOS.iPad.02.UIPopoverViewController
    iOS.iPad.01.UISplitViewController
  • 原文地址:https://www.cnblogs.com/chengege/p/10749666.html
Copyright © 2020-2023  润新知