【一】定义form组件
forms.py
# 定义form类
class MyForm(forms.Form):
# username : 字符串类型 最小三位,最大八位
username = forms.CharField(max_length=8, min_length=3, label="用户名",
error_messages={
"max_length": "最大八位",
"min_length": "最小三位",
"required": "必填字段",
})
# # username : 字符串类型 最小三位,最大八位 : 字符串类型 最小三位,最大八位
password = forms.CharField(max_length=8, min_length=3, label="密码",
error_messages={
"max_length": "最大八位",
"min_length": "最小三位",
"required": "必填字段",
})
# email : 必须符合邮箱格式 [email protected]
email = forms.EmailField(label="邮箱",
error_messages={
"invalid": "格式不正确",
"required": "必填字段",
})
views.py
def index(request):
# (1)产生一个空对象
form_obj = MyForm()
# (2) 直接将空对象传递给前端页面
# (3) 获取前端输入的信息,校验并返回结果
if request.method == "POST":
# 获取前端输入的信息
'''
数据获取繁琐
校验数据需要构造成字典格式传回
ps:request.POST 可以看成是字典数据的格式
'''
# 校验并返回结果
form_obj = MyForm(request.POST)
# 判断数据是否合法
if form_obj.is_valid():
# 合法操作数据库存储数据
return HttpResponse("OK")
else:
# 数据不合法 -- 展示错误信息给前端
pass
return render(request, 'index.html', locals())
【二】Form组件自带的
- 注意上面的例子中,我们使用
{{ form.name_of_field.errors }}
模板语法,在表单里处理错误信息。 - 对于每一个表单字段的错误,它其实会实际生成一个无序列表,参考下面的样子:
<ul class="errorlist">
<li>Sender is required.</li>
</ul>
- 这个列表有个默认的CSS样式类
errorlist
,如果你想进一步定制这个样式,可以循环错误列表里的内容,然后单独设置样式:
{% if form.subject.errors %}
<ol>
{% for error in form.subject.errors %}
<li><strong>{{ error|escape }}</strong></li>
{% endfor %}
</ol>
{% endif %}
- 一切非字段的错误信息,比如表单的错误,隐藏字段的错误都保存在
{{ form.non_field_errors }}
中,上面的例子,我们把它放在了表单的外围上面,它将被按下面的HTML和CSS格式渲染:
<ul class="errorlist nonfield">
<li>Generic validation error</li>
</ul>
【三】遍历渲染错误信息
【1】自定义前端模板
<form action="" method="post">
{% for field in form_obj %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}
<p><input type="submit"></p>
</form>
【2】自动生成前端标签
<form action="" method="post">
<div class="fieldWrapper">
<label for="id_username">用户名:</label> <input type="text" name="username" maxlength="8" minlength="3" required="" id="id_username">
</div>
<div class="fieldWrapper">
<label for="id_password">Password:</label> <input type="text" name="password" maxlength="8" minlength="3" required="" id="id_password">
</div>
<div class="fieldWrapper">
<label for="id_email">Email:</label> <input type="email" name="email" required="" id="id_email">
</div>
<p><input type="submit"></p>
</form>
- 下表是
{{ field }}
中非常有用的属性,这些都是Django内置的模板语言给我们提供的方便:
属性 | 说明 |
---|---|
{{ field.label }} |
字段对应的label信息 |
{{ field.label_tag }} |
自动生成字段的label标签,注意与{{ field.label }} 的区别。 |
{{ field.id_for_label }} |
自定义字段标签的id |
{{ field.value }} |
当前字段的值,比如一个Email字段的值[email protected] |
{{ field.html_name }} |
指定字段生成的input标签中name属性的值 |
{{ field.help_text }} |
字段的帮助信息 |
{{ field.errors }} |
包含错误信息的元素 |
{{ field.is_hidden }} |
用于判断当前字段是否为隐藏的字段,如果是,返回True |
{{ field.field }} |
返回字段的参数列表。例如{{ char_field.field.max_length }} |
【四】禁止浏览器做校验
-
浏览器自动帮我们做数据校验,但是前端的校验不安全
-
如何禁止浏览器做校验?
-
在form表单中加入参数即可
<form action="" method="post" novalidate>
【1】自定义前端模板
<form action="" method="post" novalidate>
{% for form in form_obj %}
<p> {{ form.label }} : {{ form }}</p>
<span style="color: red">{{ form_obj.errors }}</span>
{% endfor %}
<p><input type="submit"></p>
</form>
【2】自动生成前端标签
<form action="" method="post" novalidate="">
<p> 用户名 : <input type="text" name="username" maxlength="8" minlength="3" required="" id="id_username"></p>
<span style="color: red"></span>
<p> Password : <input type="text" name="password" maxlength="8" minlength="3" required="" id="id_password"></p>
<span style="color: red"></span>
<p> Email : <input type="email" name="email" required="" id="id_email"></p>
<span style="color: red"></span>
<p><input type="submit"></p>
</form>
【五】不可见字段
- 很多时候,我们的表单中会有一些隐藏的不可见的字段,比如honeypot。
- 我们需要让它在任何时候都仿佛不存在一般,比如有错误的时候,如果你在页面上显示了不可见字段的错误信息,那么用户会很迷惑,这是哪来的呢?
- 所以,通常我们是不显示不可见字段的错误信息的。
- Django提供了两种独立的方法,用于循环那些不可见的和可见的字段,
hidden_fields()
和visible_fields()
。 - 这里,我们可以稍微修改一下前面的例子:
{# 循环那些不可见的字段 #}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{# 循环可见的字段 #}
{% for field in form.visible_fields %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}
【六】注意事项
【1】必要条件
- get 请求 和 post 传给页面对象变量名必须一样
def index(request):
# (1)产生一个空对象
form_obj = MyForm() # ******这里的变量名
# (2) 直接将空对象传递给前端页面
# (3) 获取前端输入的信息,校验并返回结果
if request.method == "POST":
# 获取前端输入的信息
'''
数据获取繁琐
校验数据需要构造成字典格式传回
ps:request.POST 可以看成是字典数据的格式
'''
# 校验并返回结果
form_obj = MyForm(request.POST) # ******这里的变量名
# 判断数据是否合法
if form_obj.is_valid():
# 合法操作数据库存储数据
return HttpResponse("OK")
else:
# 数据不合法 -- 展示错误信息给前端
pass
return render(request, 'index.html', locals())
【2】forms 组件
- 当你的数据不合法的情况下,会记录上一次的数据,基于上一次的数据再编辑