forms组件
- 校验字段功能
- 渲染标签功能
- 渲染错误信息功能
- 组件的参数配置
- 局部钩子(能走到它,说明前面校验已经通过了,一定能把该字段的值取出来)
- 全局钩子(能走到它,前面的全都执行过了,包括局部钩子)在做密码判断的时候,一定要注意,可能密码取出来为空
class UserInfo(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
email=models.EmailField()
模板文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<div class="container">
{# <div class="row">#}
{# <div class="col-md-6 col-md-offset-3">#}
{# <form action="" method="post" class="form-group">#}
{# 用户名:<input type="text" name="name" class="form-control"> <br>#}
{# 密码: <input type="password" name="pwd" class="form-control"> <br>#}
{# 确认密码: <input type="password" name="re_pwd" class="form-control"> <br>#}
{# 邮箱: <input type="email" name="email" class="form-control"> <br>#}
{# <button>提交</button>#}
{# </form>#}
{# </div>#}
{# </div>#}
<hr>
<h1 class="text-center">渲染页码方式一</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
{{ obj.name.label }}:{{ obj.name }} <span>{{ obj.errors.0 }}</span> <br>
{{ obj.pwd.label }}:{{ obj.pwd }} <span>{{ obj.errors.0 }}</span> <br>
{{ obj.re_pwd.label }}:{{ obj.re_pwd }} <span>{{ obj.errors.0 }} {{ errors }}</span> <br>
{{ obj.email.label }}:{{ obj.email }} <span>{{ obj.errors.0 }}</span> <br>
<button>提交</button>
</form>
</div>
</div>
<hr>
<h1 class="text-center">渲染页码方式二(for循环form对象)</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="" method="post" class="form-group">
{% for foo in obj %}
{{ foo.label }}{{ foo }} <span>{{ foo.errors }}</span> <br>
{% endfor %}
<button>提交</button>
</form>
</div>
</div>
{# <hr>#}
{# <h1>渲染页码方式三(不建议用,不易拓展)</h1>#}
{# <form action="" method="post">#}
{# {{ obj.as_p }}#}
{# <button>提交</button>#}
{# </form>#}
</div>
</body>
</html>
视图文件
from django.shortcuts import render, HttpResponse, redirect
from app01.models import *
from django import forms
from django.forms import widgets
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
class RegForm(forms.Form):
name = forms.CharField(max_length=10,
min_length=2,
label='用户名',
error_messages={
'required': '该字典必填',
'max_length': '太长了',
'min_length': '太短了'
},
widget=widgets.TextInput(attrs={'class':'form-control'}))
pwd = forms.CharField(max_length=10,
min_length=2,
label='密码',
widget=widgets.PasswordInput(attrs={'class':'form-control'}))
re_pwd = forms.CharField(max_length=10,
min_length=2,
label='确认密码',
widget=widgets.PasswordInput(attrs={'class':'form-control'}))
email = forms.EmailField(label='邮箱',
error_messages={
'invalid': '不符合邮箱格式'
},
widget=widgets.EmailInput(attrs={'class':'form-control'}))
def clean_name(self):
name = self.cleaned_data.get('name')
user = UserInfo.objects.filter(name=name).first()
if user:
raise ValidationError('用户已存在')
else:
if name.startswith('sb'):
raise ValidationError('不能以sb开头')
return name
def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd and re_pwd:
if pwd == re_pwd:
return self.cleaned_data
else:
raise ValidationError('密码不一致')
def form_test(request):
obj = RegForm()
if request.method == 'POST':
obj = RegForm(request.POST)
if obj.is_valid():
UserInfo.objects.create(**obj.cleaned_data)
else:
print(obj.errors.as_data())
errors = obj.errors.get('__all__','')
return render(request, 'form_test.html', locals())