zoukankan      html  css  js  c++  java
  • Django_Form验证(一)

    Django为我们提供了一个模板来做Form验证,不需要我们再去写复杂的验证代码了

    简单的提交信息html页面:

    1 <form action="/fff/Form" method="post">
    2     <p><input type="text" name="ac" placeholder="用户名"><span>{{ infor.errors.ac.0 }}</span></p>
    3     <p><input type="password" name="pwd" placeholder="密码"><span>{{ infor.errors.pwd.0 }}</span></p>
    4     <p><input type="text" name="eMail" placeholder="邮箱"><span>{{ infor.errors.eMail.0 }}</span></p>
    5     <p><input type="submit" value="Form提交"></p>
    6     {% csrf_token %}
    7 </form>

    解决简单的提示验证问题:

      

     1 from django import forms #导入包
     2 
     3 #开始写模板
     4 class Formsubmit(forms.Form):
     5     ac=forms.CharField(min_length=6,error_messages={"required":"用户名不能为空","min_length":"长度不够"})
     6     pwd=forms.CharField(max_length=10,error_messages={"required":"密码不能为空","max_length":"密码长度过长"})
     7     eMail=forms.EmailField(error_messages={"required":"用户名长度不能为空","invalid":"邮箱格式不对"})
     8     '''
     9     注意:
    10     1.字段的名字要和前段的字段相同,
    11     2.第二个参数就是那种错误显示那种信息,
    12     '''
    13 
    14 def Form(req):
    15     if req.method=="GET":
    16         return render(req,"Formsubmit.html")
    17     elif req.method=="POST":
    18         obj=Formsubmit(req.POST)#将得到req.POST信息传递给验证类做参数
    19         status=obj.is_valid()#这里执行后才验证,验证的信息都存储在obj这个类中
    20         if status:
    21             rightData=obj.clean()#,去获取正确的信息,这里得到的是一个字典,就可以向数据库里面提交了
    22             # models.xxx.create(**{rightData})
    23         else:
    24             errData=obj.errors#获取错误的信息,存储的是一个继承dict的类.
    25             print(errData["ac"][0])#errDara是一个类,加上['ac']是一个list类,加上[0],就是取第一个错误信息,就是一个字符串了
    26         return  render(req,"Formsubmit.html",{"infor":obj})#将信息传递给前段代码

    以上就能做到简单的验证.

    问题来了:用户实际操作中,如果只有邮箱输入错误了,账号和密码都是正确的,但是一点提交,正确的信息被刷新,必须重新输入,

    django当然也考虑到了,所以DjangoForm中还有其他功能.

      首先我们自己考虑下,做到用户点提交,页面刷新后还有原来的信息,就必须在刷新后再在我们input框中加上上一次的值,但是我们的Input框自己写死了,所以要动态生成Input框

    解决如下:

      将html代码的input框动态起来:

    <form action="/fff/Form" method="post">
        <p>{{ infor.ac }}<span>{{ infor.errors.ac.0 }}</span></p>
        <p>{{ infor.pwd }}<span>{{ infor.errors.pwd.0 }}</span></p>
        <p>{{ infor.eMail }}<span>{{ infor.errors.eMail.0 }}</span></p>
        <p><input type="submit" value="Form提交"></p>
        {% csrf_token %}
    </form>

    后台代码中再GET请求的时候也创建Form对象,但是不传入参数,渲染给页面:

    def Form(req):
        if req.method=="GET":
            obj=Formsubmit()
            return render(req,"Formsubmit.html",{"infor":obj})
            #其他都不需要修改

    这样在执行的时候,就能达到想要的效果.

    原因解释:

      从动态生成input标签的结果来看,djangoForm对象其实就是为我们自动生成标签(标签有默认和指定的),然后获取值,再验证,再在标签中加入值.这就是他的功能.

      流程:

      第一次GET提交,Form对象没有拿到值,所以直接生成了空的input标签,--->输入值,POST提交--->Form对象拿到值---->提交后页面刷新,第二次GET请求的时候,Form对象已经拿到值,所以在渲染的时候input框中有上次提交的值.

      由此可见前端页面上的Form对象必须都是一致的(列子中就是'infor')


    formobj.has_changed()   

    查看提交的数据是否改变,这个是当我们在处理edit页面的时候比较适合用到,当页面内容没有改变的时候,就不做处理

    formobj.changed_data 

    返回字段列表,查看那些字段改变了,修改起来也比较方便

    def Form(req):
        if req.method=="GET":
            return render(req,"Formsubmit.html")
        elif req.method=="POST":
            data = {'ac': '123123', 'pwd': '123123', 'eMail': '1@1.com'}#c创建initial 作为对比数据
    
            obj=Formsubmit(req.POST,initial=data)#将得到req.POST信息传递给验证类做参数
            print('是否改变了;',obj.has_changed())

    从form查看表单信息

    >>> for row in f.fields.values(): print(row)
    ...
    <django.forms.fields.CharField object at 0x7ffaac632510>
    <django.forms.fields.URLField object at 0x7ffaac632f90>
    <django.forms.fields.CharField object at 0x7ffaac3aa050>
    >>> f.fields['name']
    <django.forms.fields.CharField object at 0x7ffaac6324d0>

    formobj.cleaned_data

    返回'干净'的数据,并且只返回form中定义了的字段,如果是自己额外加的初始化字段,不会返回,并且只返回验证通过了的字段

    比如:

    >>> data = {'subject': '',
    ...         'message': 'Hi there',
    ...         'sender': 'invalid email address',
    ...         'cc_myself': True}
    >>> f = ContactForm(data)
    >>> f.is_valid()
    False 
    >>> f.cleaned_data
    {'cc_myself': True, 'message': 'Hi there'}#只返回了验证通过的字段
    >>> data = {'subject': 'hello',
    ...         'message': 'Hi there',
    ...         'sender': 'foo@example.com',
    ...         'cc_myself': True,
    ...         'extra_field_1': 'foo',
    ...         'extra_field_2': 'bar',
    ...         'extra_field_3': 'baz'}
    >>> f = ContactForm(data)
    >>> f.is_valid()
    True
    >>> f.cleaned_data # 没有包含额外添加的字段
    {'cc_myself': True, 'message': 'Hi there', 'sender': 'foo@example.com', 'subject': 'hello'}

    form快捷显示:

    直接打印

    print(formobj)

    print(formobj.as_p())

    ...就会看到区别,当然也可以单个字段打印

    print(formobj['name'])

  • 相关阅读:
    springboot 2.3.3与springcloud Greenwich.SR1兼容问题
    Spring WebClient使用
    jquery选择器
    jquery入门
    tomcat
    web基础常识
    python面对对象
    python读取excel生成verilog代码并例化
    python学习之re的正则修饰符
    python学习笔记re常用的方法
  • 原文地址:https://www.cnblogs.com/guoguojj/p/8083051.html
Copyright © 2011-2022 走看看