流程都是一样的。就不在详细的记录。只写一点需要注意的地方! 或者 可以改进的地方!
1. 用户表中 只有。 name password email 三个字段。 但是添加用户的页面,应该还要有确认密码的字段。
所以,在UserInfoModelForm(forms.ModelForm): 中需要自己添加一个字段:
confirm_password = forms.CharField(label="确认密码")
2. 样式问题,因为是基于bootstrap 所以会简单很多。 添加class属性的方法, 有两种:
a. 手动添加:
class Meta: model = models.UserInfo fields = ["name", "password", "confirm_password", "email"] 手动的修改,显示什么样的错误信息 # 这里我是修改settings中的,语言配置。 改成 zh-hans error_messages = { "name": {"required": "用户名不能为空"}, "password": {"required": "密码不能为空"}, "confirm_password": {"required": "确认密码不能为空"}, "email": {"required": "邮箱不能为空"}, }
widgets = {"title": forms.TextInput(attrs={"class": "form-control"})}
通过widgets 属性, 对每一个字段,添加属性。 比较麻烦。
b. 使用初始化方法, 继承父类。进行修改。
def __init__(self, *args, **kwargs): super(UserInfoModelForm, self).__init__(*args, **kwargs) # 循环父类中生成的所有的字段,为每一个字段添加样式, 一次性为所有字典添加样式 for name, field in self.fields.items(): field.widget.attrs["class"] = "form-control"
3. 然后是,局部钩子。 错误信息的展示:
def clean_confirm_password(self): ''' 检测两次密码 是否一致 :return: ''' password = self.cleaned_data.get("password") confrim_password = self.cleaned_data.get("confirm_password") if password != confrim_password: raise ValidationError("两次密码输入不一致") return confrim_password
最终所有的,forms 组件的代码:
UserInfoModelForm