首页 > 其他分享 >【20.3】Django框架Form组件之渲染错误信息

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

时间:2024-03-18 23:36:55浏览次数:15  
标签:20.3 obj Form form request 校验 label field Django

【一】定义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 组件

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

标签:20.3,obj,Form,form,request,校验,label,field,Django
From: https://www.cnblogs.com/dream-ze/p/18081776

相关文章

  • 【20.7】Django表单API详解
    【一】引入声明:以下的Form、表单等术语都指的的广义的Django表单。Form要么是绑定了数据的,要么是未绑定数据的。如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单。如果未绑定,则无法进行验证(因为没有数据可以验证!),但它仍然可以以HTML形式呈现空白表单。若要......
  • 【20.6】Django框架Form组件之模型表单ModelForm
    【一】引入如果你正在构建一个数据库驱动的应用,那么你可能会有与Django的模型紧密映射的表单。比如,你有个BlogComment模型,并且你还想创建一个表单让大家提交评论到这个模型中。在这种情况下,写一个forms.Form类,然后在表单类中定义字段,这种一般创建表单的做法是冗余的,因为你已经......
  • 【20.5】Django框架Form组件之源码
    【一】切入点切入点form_obj.is_valid()defis_valid(self):"""ReturnTrueiftheformhasnoerrors,orFalseotherwise."""returnself.is_boundandnotself.errors如果is_valid要想返回True那么self.is_bound要为Trueself.errors......
  • Django 用re_path()方法正则匹配复杂路由
    app1.url.pyfromdjango.urlsimportpath,re_pathfrom.importviewsurlpatterns=[path('index',views.index,name='index'),path('test',views.test,name='test'),path('test_int/<int:id>/......
  • 【20.0】Django框架之Form组件
    【一】Django的表单系统【1】使用表单(1)原始表单我们之前在HTML页面中利用form表单向后端提交数据时都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同时我们在好多场景下都需要对用户的输入做校验比如校验用户是否输入输入的长度和格式等正不正确。......
  • 【10.0】Django框架之路由层
    【零】Django的路由系统【1】什么是URL配置(URLconf)URL调度器|Django文档|Django(djangoproject.com)URL配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代......
  • 【9.0】Django框架之生命周期流程图
    【5.0】Django框架之请求生命周期流程图解释图:浏览器>>发送请求(Http请求)>>web服务网关接口(django默认的wsgiref模块不能承受高并发,最大只有1000左右)>>中间件>>缓存数据库(返回给中间件已经缓存过的数据)>>urls.py(路由层)>>views.py(视图层)>>templates(模板......
  • 【13.0】Django框架之模型层
    【一】前言Django自带的sqlite3数据对日期格式不敏感,处理的时候容易出错【1】测试脚本测试脚本当我们只想要测试Django中的某一个py文件的内容时,我们可以不需要书写前后端交互的形式,而是直接写一个测试脚本即可测试环境的准备在测试文件中书写下面内容这内容其......
  • 【12.0】Django框架之模板层
    【零】Django模板系统模板|Django文档|Django(djangoproject.com)【一】模板语法的传值{{}}:变量相关{%%}:逻辑相关【0】变量(1)传值在Django的模板语言中按此语法使用:{{变量名}}。当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。变......
  • 【11.0】Django框架之视图层
    【一】三板斧【1】HttpResponseHttpResponse是Django中用于创建HTTP响应对象的类,它允许你构建并返回服务器对客户端请求的数据和状态。当需要直接返回纯文本数据(如JSON格式的数据)或者HTML页面时,可以使用HttpResponse。fromdjango.httpimportHttpResponsedef......