zoukankan      html  css  js  c++  java
  • 25)django-form使用

    目录

      1)django form作用

      2)django form使用

     

    一:django form 作用

      django form有两个作用:一是用户输入数据验证;二是生成html

      1)用户输入数据验证,比如用户输入的用户名密码,不能为空,邮件格式验证等。如果自己写正则写很复杂。可以使用django form实现验证

      2)通过django form生成html表单

    二:django form使用

      1)form常用方法 

        #表单使用
        obj=FM(request.POST) #把POST信息提交给表单验证
        r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False
        print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面
        print(obj.errors)#验证错误的信息obj.errors里面(列表ul)
        print(obj.errors.as_json()) 返回是字典

      2) form使用简单示例

    #创建
        from django import forms
        class FM(forms.Form)
    
    
        from django import forms
        class FM(forms.Form):
            user=forms.CharField()
            pwd=forms.CharField()
            email=forms.EmailField()
            #假如用户提交了很多数据过来,我怎么知道是那一个是我们需要验证的。
            这里的user和form表单里的name值是一致的。即定义的字段和form表单里的name属性的值必须要一致
    
    
        <form action="/fm/" method="post">
            {% csrf_token %}
            <input type="text" name="user">
            <input type="password" name="pwd">
            <input type="text" name="email">
            <input type="submit" value="提交">
        </form>
    
    
        #表单使用
    
        obj=FM(request.POST) #把POST信息提交给表单验证
        r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False
        print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面
        print(obj.errors)#验证错误的信息obj.errors里面(列表ul)
        print(obj.errors.as_json()) 返回是字典
        示例:
    
        def fm(request):
            if request.method=="GET":
                return render(request,'fm.html')
            if request.method=="POST":
                #获取用户所有数据
                #每条数据请求的验证
                #成功:获取所有正确的信息
                #失败:显示错误信息
                obj=FM(request.POST) #把POST信息提交给表单验证
                r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False
                print(r1)
                if r1:
                    print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面
                else:
                     print(obj.errors)#验证错误的信息obj.errors里面
                return redirect("/index/")
    
        结果:
        False
        <ul class="errorlist"><li>user<ul class="errorlist"><li>This field is required.</li></ul></li><li>pwd<ul class="errorlist"><li>This field is required.</li></ul></li><li>email<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
    
    
        True
        {'user': 'root', 'pwd': '`12', 'email': '123@126.com'}
    
    
    
        {"user": [{"message": "This field is required.", "code": "required"}], "pwd": [{"message": "This field is required.", "code": "required"}], "email": [{"message": "This field is required.", "code": "required"}]}
    View Code

       3)上面错误都是英文,能不能定制。  

        #2)上面错误都是英文,能不能定制。
        from django import forms
        class FM(forms.Form):
            #我只关心我关心的
            user=forms.CharField(error_messages={'required':'用户名不能为空'})
            pwd=forms.CharField(max_length=12,
                                min_length=6,
                                error_messages={'min_length':'密码长度不能小于6','max_length':'密码长度不能大于12','required':'密码不能为空'})
            email=forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'})
            #假如用户提交了很多数据过来,我怎么知道是那一个是我们需要验证的。这里的user和form表单里的name值是一致的。
    View Code

      4)错误信息传递给模板

        def fm(request):
            if request.method=="GET":
                return render(request,'fm.html')
            if request.method=="POST":
                #获取用户所有数据
                #每条数据请求的验证
                #成功:获取所有正确的信息
                #失败:显示错误信息
                obj=FM(request.POST) #把POST信息提交给表单验证
                r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False
                print(r1)
                if r1:
                    print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面
                else:
                    #obj.errors 继承了ErrirDict,是个字典obj.errors.user 会出错。正确写法:obj.errors["user"]
                    print(obj.errors)#验证错误的信息obj.errors里面
                    # print(obj.errors["user"][0])#拿到第一个错误信息
                    #把错误信息传递到模板
                    return render(request,'fm.html',{"obj":obj})
        
                return render(request,'fm.html')
    
        fm.html
    
            <form action="/fm/" method="post">
            {% csrf_token %}
            <p><input type="text" name="user">
                {{ obj.errors.user.0 }}
            </p>
            <p>
            <input type="password" name="pwd">
                {{ obj.errors.pwd.0 }}
                </p>
            <p><input type="text" name="email">
            {{ obj.errors.email.0 }}</p>
            <input type="submit" value="提交">
        </form>
    View Code

      5)上面错误信息显示了,但是原来输入的值没有了。上面不仅显示错误信息,还可以输出标签 

        <form action="/fm/" method="post">
            {% csrf_token %}
            <p>{{ obj.user }}
                {{ obj.errors.user.0 }}
            </p>
            <p>
                {{ obj.pwd }}
                {{ obj.errors.pwd.0 }}
            </p>
            <p>{{ obj.email }}
                {{ obj.errors.email.0 }}</p>
            <input type="submit" value="提交">
        </form>
        但是上面没有显示输入框,因为第一次请求是GET,没有返回对象
        所以GET模式要创建对象,不需要传递参数,但是变量名和POST一样。
    
    
        def fm(request):
            if request.method=="GET":
                obj=FM()
                return render(request,'fm.html',{"obj":obj})
            if request.method=="POST":
                #获取用户所有数据
                #每条数据请求的验证
                #成功:获取所有正确的信息
                #失败:显示错误信息
                obj=FM(request.POST) #把POST信息提交给表单验证
                r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False
                print(r1)
                if r1:
                    print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面
                else:
                    #obj.errors 继承了ErrirDict,是个字典obj.errors.user 会出错。正确写法:obj.errors["user"]
                    print(obj.errors)#验证错误的信息obj.errors里面
                    # print(obj.errors["user"][0])#拿到第一个错误信息
                    #把错误信息传递到模板
                    return render(request,'fm.html',{"obj":obj})
        
                return render(request,'fm.html')
    
        #注意浏览器可能会自己加些东西显示。
    View Code

      6)上面如果值如果正确。那就可以入库了

        #5)上面如果值如果正确。那就可以入库了
            models.UserInfo.objects.create(**obj.cleaned_data)
    
    
        def fm(request):
            if request.method=="GET":
                obj=FM()
                return render(request,'fm.html',{"obj":obj})
            if request.method=="POST":
                #获取用户所有数据
                #每条数据请求的验证
                #成功:获取所有正确的信息
                #失败:显示错误信息
                obj=FM(request.POST) #把POST信息提交给表单验证
                r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False
                print(r1)
                if r1:
                    print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面
                    models.UserInfo.objects.create(**obj.cleaned_data)
                    return redirect("/index")
                else:
                    #obj.errors 继承了ErrirDict,是个字典obj.errors.user 会出错。正确写法:obj.errors["user"]
                    print(obj.errors)#验证错误的信息obj.errors里面
                    # print(obj.errors["user"][0])#拿到第一个错误信息
                    #把错误信息传递到模板
                    return render(request,'fm.html',{"obj":obj})
    View Code

      7)快速生成ul,p,table的form 页面

        1)验证用户请求
        2)生成HTML(保留上一次输入的数据)
            上面还支持另外种方式,但是还是建议使用上面,定制方便。
    
            <body>
            <form action="/fm/" method="post">
                {% csrf_token %}
                    {{ obj.as_p }}  #p标签方式显示
                <input type="submit" value="提交">
            </form>
            
            <form action="/fm/" method="post">
                {% csrf_token %}
                    {{ obj.as_ul }}  #显示列表
                <input type="submit" value="提交">
            </form>
            
            <form action="/fm/" method="post">
                {% csrf_token %}
                    {{ obj.as_table }} #显示表格
                <input type="submit" value="提交">
            </form>
            </body>
    View Code

      8)怎么设置样式

    #form字段
        XXXField()字段本身只做验证
        设置样式是inputext用插件widgets
        user=forms.CharField(error_messages={'required':'用户名不能为空'},widget=widgets.Textarea(attrs={"class":"c1"}))
    
    
        from django import forms
        from django.forms import widgets,fields
        class FM(forms.Form):
            #我只关心我关心的
            user=fields.CharField(error_messages={'required':'用户名不能为空'},widget=widgets.Textarea(attrs={"class":"c1"}))
            pwd=fields.CharField(max_length=12,
                                min_length=6,
                                error_messages={'min_length':'密码长度不能小于6','max_length':'密码长度不能大于12','required':'密码不能为空'})
            email=forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'})
            #假如用户提交了很多数据过来,我怎么知道是那一个是我们需要验证的。这里的user和form表单里的name值是一致的。
    
        fields包括了所有的XXField,推荐使用这种写法。
        widgets包括了所有的插件
    View Code
  • 相关阅读:
    python第一课
    go反射----4构建
    go反射----3方法
    go反射----2值
    go生成xml
    go互斥锁Mutex
    go中的读写锁RWMutex
    go语言调用cmd
    go语言发送邮件
    go语言文件操作
  • 原文地址:https://www.cnblogs.com/lixiang1013/p/7859712.html
Copyright © 2011-2022 走看看