写了这么多的定制 功能。终于可以定制一下了!
因为是 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 选项的, 让其显示中文的功能。

crm开发之用户ModelForm定制和密码加密的更多相关文章

  1. crm开发之用户重置密码

    重置 密码这这功能. 我是没有在,stark组件中. 内置的.所以需要,自己进行定制.也就只是,在已有的增删改查的基础上,再增加一条url  和相对应的  视图函数. 好的是, 我已经预留了,增加的接 ...

  2. 使用bcrypt进行用户密码加密的简单实现

    Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...

  3. Django项目:CRM(客户关系管理系统)--45--37PerfectCRM实现King_admin添加用户时密码加密

    #views # ————————02PerfectCRM创建ADMIN页面———————— from django.shortcuts import render # ————————04Perfe ...

  4. iOS:iOS开发中用户密码保存位置

    原文来自简书:http://www.jianshu.com/p/4af3b8179136/comments/1294203 如果要实现自动登录,不必每次打开应用都去登录,我们势必要把密码保存到本地.一 ...

  5. Python开发之用户密码存储

    在各种线上应用中,用户名密码是用户身份认证的关键,它的重要性不言而喻.一方面,作为保护用户敏感数据的钥匙来说,一旦被破解,系统将敞开大门完全不设防.另一方面,密码这把钥匙本身就是非常敏感的数据:大多数 ...

  6. MVC5 网站开发之七 用户功能 1、角色的后台管理

    角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...

  7. MVC5 网站开发之七 用户功能 2 用户添加和浏览

    目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...

  8. MVC5 网站开发之七 用户功能 3用户资料的修改和删除

    这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...

  9. oAuth 使得第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权

    OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可 ...

随机推荐

  1. VS2017 ASP.NET MVC 5.0 开部署问题汇总

    1[SqlException (0x80131904): 拒绝了对对象 '****' (数据库 '***',架构 'dbo')的 EXECUTE 权限.] “/”应用程序中的服务器错误. SQL 20 ...

  2. Xilinx FPGA开发随笔

    1.UCF文件 1.1.UCF作用 UCF文件主要是完成管脚的约束,时钟的约束, 以及组的约束. 1.2.UCF语法 普通IO口只需约束引脚号和电压: NET "端口名称" LOC ...

  3. udt的java实现

    udt协议是什么? 我就不回答了,可以网上搜索,一直都是c++的,java的实现已经很久没有修改了 经过测试,java版本有些一问题,现在已经将其修复,已经上传到csdn 另外自己根据实际的应用,再次 ...

  4. (二)获取Access_token

    获取access_token access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保 ...

  5. sql 查询语句的练习

    --1.使用基本查询语句. --(1)查询DEPT表显示所有部门名称. select * from dept; --(2)查询EMP表显示所有雇员名及其全年收入(月收入=工资+补助),处理NULL行, ...

  6. NFS服务器工作原理

    一.NFS简介 NFS是Network File System的缩写,中文称为网络文件系统,它的主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器 ...

  7. IntelliJ IDEA 打开项目红色

    项目目录红色主要是有版本控制所导致的,解决办法就是解除版本控制 点击File->Settings...->Version Control 项目会重新编译,项目目录红色会消失

  8. 一些常见的Java面试题 & 面试感悟

    < 前言 > 近期在面试,深感这个行业的浮躁,一些菜不辣基的弱鸡开出的工资待遇要求,超过了我.不知道他们是怎么拿到那么高的工资的,难道是他在公司有亲戚朋友吗?有后台吗?是行业热钱真的过多了 ...

  9. MVC人员管理系统

    基本都要使用C控制器中的两个action来完成操作,一个用于从主界面跳转到新页面.同时将所需操作的数据传到新界面,另一个则对应新界面的按钮,用于完成操作.将数据传回主界面以及跳转回主界面.根据不同情况 ...

  10. ArcGIS API for JS 测量线长(各折线段)

    这里测量长度主要分为两个方面,一个是在绘制长折线段时,不仅需要显示总线段的长度,还要在各线段的中间显示各折线段的长度:另一个则是在绘制多边形时,不仅需要显示多边形的面积,还需要在各边的中间显示线段长. ...