Django的表单模块提供的主要功能
- 准备和重构数据,用于页面渲染
- 为数据创建HTML表单元素
- 接收和处理用户使用表单提交的数据
使用方式
- 定义表单类
表单类都必须直接或间接继承自django.forms.Form
可以结合模型使用。
models.py文件
class User(models.Model):
username = models.CharField(max_length=30)
password = models.CharField(max_length=128)
class Meta:
db_table = 'user'
forms.py文件
def check_password(value):
if re.match(r'\d*$', value, re.I):
raise ValidationError('密码不能只包含数字')
class RegisterForm(forms.Form):
username = forms.CharField(required=True, error_messages={'required': '用户名不能为空'})
password = forms.CharField(required=True, validators=[check_password], error_messages={'required': '密码不能为空'})
confirm_password = forms.CharField(required=True, error_messages={'required': '密码不能为空'})
email = forms.EmailField(error_messages={'invalid': '格式错误'})
- 前端模板使用及渲染
<body>
<form action="{% url 'App01:register' %}" method="post">
{% csrf_token %}
username: <input type="text" name="username"><span>{{ form.username.errors }}</span> <br>
password: <input type="password" name="password"><span>{{ form.password.errors }}</span> <br>
confirm_password: <input type="password" name="confirm_password"><span>{{ form.confirm_password.errors }}</span> <br>
email: <input type="text" name="email"><span>{{ form.email.errors }}</span> <br>
<input type="submit">
</form>
</body>
- 后端视图函数
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
# 所有验证都通过
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = User(username=username, password=password)
# 保存数据
user.save()
return HttpResponse('index')
else:
return render(request, 'register.html', locals())
form = RegisterForm()
return render(request, 'register.html', locals())
- 重写表单验证
验证的函数名必须为“clean_字段名”的形式,而且必须有返回值。
继续在forms.py文件中定义的RegisterForm表单类下添加
def clean_username(self):
useranme = self.cleaned_data.get('username')
if User.objects.filter(username=useranme).first():
raise ValidationError('用户名重复')
return useranme
def clean(self):
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if password != confirm_password:
raise ValidationError('两次输入的密码不匹配')
return self.cleaned_data
这样用户在注册网页中填入相应信息,点击提交之后,如果没有通过验证,会直接提示对应的报错信息。
示例: