9.forms 组件
1.校验字段功能
针对一个实例:注册用户讲解。
视图
model.py
class UserInfo(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
email=models.EmailField()
tel=models.CharField(max_length=32)
views.py
from django import forms
from django.core.exceptions import ValidationError
wid_01 = forms.TextInput(attrs={"class": "form-control"})
wid_02 = forms.PasswordInput(attrs={"class": "form-control"})
class UserForm(forms.Form):
name = forms.CharField(max_length=32, label="用户名", widget=wid_01)
pwd = forms.CharField(label="密码", widget=wid_02)
r_pwd = forms.CharField(label="确认密码", widget=wid_02)
email = forms.EmailField(label="邮件", widget=wid_01)
tel = forms.CharField(max_length=32, label="手机号码", widget=wid_01)
def register(request):
if request.method=="POST":
user=UserForm(request.POST)
if user.is_valid():
print(user.cleaned_data) # 所有干净的字段以及对应的值
else:
print(user.cleaned_data)
print(user.errors)
print(type(user.errors.get("name")))# ErrorDict:{"校验错误的字段":["错误信息",]}
print(user.errors.get("name")) # ErrorList ["错误信息"]
print(user.errors.get("name")[0])
for i in user:
print(i)
return HttpResponse("OK")
user=UserForm()
return render(request,"register.html",{"user": user})
模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<div>
<label for="user">用户名</label>
<p><input type="text" ></p>
</div>
<div>
<label for="pwd">密码</label>
<p><input type="password" ></p>
</div>
<div>
<label for="r_pwd">确认密码</label>
<p><input type="password" ></p>
</div>
<div>
<label for="email">邮箱</label>
<p><input type="text" ></p>
</div>
<input type="submit">
</form>
</body>
</html>
2.渲染标签功能
渲染方式 1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<h3>注册页面</h3>
<div>
<div>
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
{% csrf_token %}
<div class="form-group">
<label for="">用户名</label>
{{ form.name }}
</div>
<div>
<label for="">密码</label>
{{ form.pwd }}
</div>
<div>
<label for="">确认密码</label>
{{ form.r_pwd }}
</div>
<div>
<label for=""> 邮箱</label>
{{ form.email }}
</div>
<input type="submit">
</form>
</div>
</div>
</div>
</body>
</html>
渲染方式 2
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="">{{ field.label }}</label>
{{ field }}
</div>
{% endfor %}
<input type="submit">
</form>
</div>
渲染方式 3
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
3.重置输入信息功能
视图
def register(request):
if request.method=="POST":
user=UserForm(request.POST)
if request.method == "POST":
dict1 = {}
user = UserForm(request.POST)
if user.is_valid():
print(user.cleaned_data)
else:
dict1["clean_error"] = user.errors.get("__all__")
dict1["user"] = user
return render(request, "register.html", dict1)
user = UserForm()
return render(request,"register.html",{"user": user})
模板
注意: 使用渲染方式2
4.局部钩子与全局钩子
视图
from django import forms
from django.core.exceptions import ValidationError
wid_01 = forms.TextInput(attrs={"class": "form-control"})
wid_02 = forms.PasswordInput(attrs={"class": "form-control"})
class UserForm(forms.Form):
name = forms.CharField(max_length=32, label="用户名", widget=wid_01)
pwd = forms.CharField(label="密码", widget=wid_02)
r_pwd = forms.CharField(label="确认密码", widget=wid_02)
email = forms.EmailField(label="邮件", widget=wid_01)
tel = forms.CharField(max_length=32, label="手机号码", widget=wid_01)
def clean_name(self):
"""局部钩子"""
val = self.cleaned_data.get("name")
if val.isdigit():
return val
else:
raise ValidationError("用户名不能是纯数字!")
def clean(self):
"""全局钩子"""
pwd = self.cleaned_data.get("pwd")
r_pwd = self.cleaned_data.get("r_pwd")
if pwd == r_pwd:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致!')
模板
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
{% csrf_token %}
{% for field in user %}
<div class="form-group">
<label for="">{{ field.label }}</label>
{{ field }}
<span class="pull-right text-danger">
{% if field.id_for_label == 'id_r_pwd' %}
{{ clean_error.0 }}
{% endif %}
{{ field.errors.0 }}
</span>
</div>
{% endfor %}
<input type="submit">
</form>
</div>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix