提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Django Form 组件用于对页面进行初始化,生成 HTML 标签,此外还可以对用户提交对数据进行校验(显示错误信息)。
Form组件使用
- 创建Fom组件类
# TestDB 文件夹下的 app_example.py
from django import forms
from django.core.exceptions import ValidationError # 错误校验
class MyForm(forms.Form):
# label表示生成的html输入框前的文字描述
# error_messages表示错误信息
name = forms.CharField(min_length=4, label="姓名", error_messages={"min_length": "长度不能小于4", "required": "该字段不能为空"})
age = forms.IntegerField(label="年龄")
salary = forms.IntegerField(label="工资")
r_salary = forms.IntegerField(label="确认工资")
- 定义路由
# 使用路由分发的方式
# HelloDJango为项目根 urls.py
from django.urls import path, include
urlpatterns = [
# forms组件
path("testdb/", include("TestDB.urls")),
]
# TestDB 文件夹下的 urls.py
from django.urls import path
from TestDB import views
urlpatterns = [
# forms组件
path("add_info/", views.addInfo)
]
- 定义处理函数
# TestDB 下的views.py
def addInfo(request):
# 直接发送请求为GET,渲染页面
if request.method == "GET":
form = MyForm()
return render(request, "index.html", {"form": form})
else:
# 处理表单提交
form = MyForm(request.POST)
if form.is_valid(): # 如果校验成功
data = form.cleaned_data # 校验成功的数据放在cleaned_data中
print(data)
return HttpResponse(json.dumps(data, ensure_ascii=False), 'application/json')
else:
print(form.errors)
clean_errors = form.errors.get("__all__")
return render(request, "index.html", {"form": form, "clean_errors": clean_errors})
- html页面
<body>
<h1>Hello World</h1>
<form action="" method="post">
{% csrf_token %} <!--处理POST提交-->
{{ form.as_p }} <!--获取表单元素-->
<input type="submit" vlaue="提交"/>
</form>
</body>
- 运行结果
可以通过clean_data获取校验成功后的数据
校验不通过可以obj.errors获取错误
局部钩子和全局钩子
可以通过钩子对字段进行错误校验,使用form提供的ValidationError,导入:
from django.core.exceptions import ValidationError
- 钩子的定义:局部钩子 -》 clean_字段名,如
# 定义局部钩子, 以clean_字段名 方式定义
def clean_name(self):
value = self.cleaned_data.get("name")
if value.isdigit():
raise forms.ValidationError("用户名不能纯数字")
else:
return value
- 全局钩子
def clean(self):
salary = self.cleaned_data.get("salary")
r_salary = self.cleaned_data.get("r_salary")
if salary == r_salary:
return self.cleaned_data
else:
raise ValidationError("请确认工资一致")
总结
简单记录实现forms组件的流程