视频加载失败

Django框架Form组件之渲染错误信息

1365 字
7 分钟
Django框架Form组件之渲染错误信息

【一】定义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 : 必须符合邮箱格式 xxx@xx.com
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字段的值someone@example.com
{{ 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 组件#

  • 当你的数据不合法的情况下,会记录上一次的数据,基于上一次的数据再编辑

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Django框架Form组件之渲染错误信息
https://firefly.cuteleaf.cn/posts/framework/python/django/base/203django框架form组件之渲染错误信息/
作者
Dream
发布于
2023-07-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录