Django form表单功能的引用(注册,复写form.clean方法 增加 验证密码功能)

1. 在app下 新建 forms.py 

 定义表单内容,类型models

from django import forms


class RegisterForm(forms.Form):
    username = forms.CharField(label='用户名', max_length=20)   # CharField 对应 html的 input type=text name= 前面的username ,label 对应lable
    password = forms.CharField(label='密码',
                               max_length=12,
                               min_length=6,
                               widget=forms.PasswordInput(attrs={'placehodler':  #  密码类型的 input
                                '请输入长度为6-12位的密码'}),
                               error_messages={                       # 定义错误信息 和上面的属性对应.
                                   'min_length': '密码长度小于6位',
                                   'max_length': '密码长度大于12位'
                               })
    password_repeat = forms.CharField(label='再次输入密码', widget=forms.PasswordInput())
    email = forms.EmailField()

 

 

2. 定义视图,实例化form表单,传到前端

from teatcher.forms import RegisterForm   # 导入 自定义form 

def register(request):
    if request.method == 'GET':
       form = RegisterForm()  # 实例化
       return render(request, 'register.html',context={'form': form})  #传到前端 

 

3. 新增url 及 前端 html模板

 

<body>
<form action="">
{% csrf_token %}
{{ form }} # 显示 表单 内容. form 和 submit 需要手动添加,不在form(只有字段) 范围内.
<input type="submit" value="提交">
</form>
</body>

 

<body>
<form action="" method='post'> 
{{ form.as_p }}      # form.as_p 每一行加 <o>标签  
<input type="submit" value="提交">
</form>
</body>
# views.py
def
register(request): if request.method == 'GET': form = RegisterForm() #return render(request, 'register.html', context={'form': form}) if request.method=='POST': form = RegisterForm(request.POST) # 从前端获得了数据, 填充了数据的form 实例 if form.is_valid(): # is_valid()自动判断是否满足 form 定义时的条件.true 验证成功
        return HttpRespone('注册成功')
  
   return render(request, 'register.html', context={'form': form})  #如果 上面的条件都不满足(中间没有return )执行这一条



# 上面的 is_valid 方法. 调用了 form.clean方法 验证 数据,默认不验证 二个输入密码的一致性.

在forms.py 中 重写 clean方法.继承父类的功能,增加新功能.

#  1定义form 表单, 2 在view 中注册 3.复写 clean 方法(验证信息)

from django import forms


class RegisterForm(forms.Form):
username = forms.CharField(label='用户名', max_length=20) # CharField 对应 html的 input type=text name= 前面的username ,label 对应lable
password = forms.CharField(label='密码',
max_length=12,
min_length=6,
widget=forms.PasswordInput(attrs={'placehodler': # 密码类型的 input
'请输入长度为6-12位的密码'}),
error_messages={ # 定义错误信息 和上面的属性对应.
'min_length': '密码长度小于6位',
'max_length': '密码长度大于12位'
})
password_repeat = forms.CharField(label='再次输入密码', widget=forms.PasswordInput())
email = forms.EmailField()

def clean(self): # 复写父类的方法
# 调用 is_valid 方法的时候,就会去调用 clean方法
clean_data = super().clean() # 保证父类的 clean方法被执行.要这么写. 父类没有验证信息一致性的功能,以下为验证密码(变量名看上面的属性名)
password = clean_data.get('passwrod') # 父类 处理过的数据中 拿到 pssword 变量
password_repeat = clean_data.get('password_repeat') # 父类 处理过的数据中 拿到 password_repeat 变量
if password != password_repeat:
msg = '密码不一致'
self.add_error('password_repeat', msg) # 给属性加了一个 error信息.


 

posted on 2019-03-22 18:52  卓达  阅读(266)  评论(0编辑  收藏  举报

导航