django做form表單的數據驗證


我們之前寫的代碼都沒有對前端input框輸入的數據做驗證,我們今天來看下,如果做form表單的數據的驗證

在views文件做驗證

首先用文字描述一下流程

1、在views文件中導入forms模塊

2、然后創建一個類,繼承forms.form

3、然后在這個類中寫變量,這個變量的就是input標簽中的name,也就是前端往后端傳遞的k值,我們就可以對這個k值對應的v值做數據內容的校驗,比如是郵箱模式,比如是否允許空,最大字段長度,最小字段長度

4、然后在視圖函數中,實例化一個步驟3中的類,然后用這個對象去接受request.post中的值,然后對象就會根據post方式傳遞來的k值和類中的k對應,然后比較post傳遞過來的v值是否符合規范

5、

 

 

 

 

1、先導入forms模塊

from django import forms

  

2、創建模板的類

# 1、創建模板
class loginform(forms.Form):
    # 2、模板中的元素
    name = forms.CharField(min_length=6,error_messages={"requird":"用戶名不能為空","min_length":"最小長度為6"})
    # requird這個是錯誤碼

    email = forms.EmailField()

  

這里這個error_messages寫出錯的信息,每個不同的錯誤碼對應不同的報錯信息

3、在視圖函數中使用這個類

def login(request):
    if request.method.lower() == "post":
        # 3、創建一個模板的對象,然后把數據傳遞個這個對象
        obj = loginform(request.POST)

        # 4、啟動校驗

        status= obj.is_valid()
        print(status)

        # 5、正確的信息
        success_dict = obj.clean()
        print(success_dict)

        # 6、錯誤的信息
        failed_dict = obj.errors.as_json()
        print(failed_dict)
        return redirect("/app1/login")
    else:
        return render(request,"login.html")

  

這里就會校驗前台發來的數據中,k為name和email的值的合法性

 

 

因為是form表單,所以提交后頁面會刷新,上次輸入的數據就沒有了,我們可以通過下面的方式實現保留上次輸入的值

前端代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>form提交測試</h1>
    <form method="post" action="/app1/login/">
        <p>
{#            <input type="text" name="name" placeholder="用戶名">#}
{#            這段html要django幫我們生成#}

            {{ xx.name }}
            <span>{{ xx.error.name.0 }}</span>
        </p>
        <p>
{#            <input type="text" name="email" placeholder="郵箱">#}
            {#            這段html要django幫我們生成#}



            {{ xx.email }}
            <span>{{ xx.error.email.0 }}</span>
        </p>
        <p>
            <input type="text" name="pwd" placeholder="密碼">
        </p>
        <input type="submit" value="submit提交">
        <input type="button" value="ajax提交" id="ajax_test1">
    </form>
    <script src="/static/jq/jquery-3.3.1.js"></script>
    <script>
        $(function () {

        })

        $("#ajax_test1").bind("click",function () {
            $.ajax({
                    url:"/app1/login/",
                    type:"POST",
                    data:{
                      name:"cui",
                      email:"cui@126.com",
                      pwd:"admin123."
                    }
            }
            )
        })
    </script>
</body>
</html>

  

后端代碼

from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
# Create your views here.



from django import forms

"""
def login(request):
    if request.method.lower() == "post":
        print(request.POST.get("name"))
        return redirect("/app1/login")
    else:
        return render(request,"login.html")
        # return redirect("/app1/login")
    # return HttpResponse("hahh")
"""



# 1、創建模板
class loginform(forms.Form):
    # 2、模板中的元素
    name = forms.CharField(min_length=6,error_messages={"required":"用戶名不能為空","min_length":"最小長度為6666666666"})
    # requird這個是錯誤碼

    email = forms.EmailField(error_messages={"required":"郵箱不能為空","invalid":"郵箱格式錯誤"})

def login(request):
    if request.method.lower() == "post":
        # 3、創建一個模板的對象,然后把數據傳遞個這個對象
        obj = loginform(request.POST)

        # 4、啟動校驗

        status= obj.is_valid()
        print(status)

        # 5、正確的信息
        success_dict = obj.clean()
        print("正確的信息----------->",success_dict)

        # 6_1、錯誤的信息1
        # failed_dict = obj.errors.as_json()

        # 6_2、錯誤的信息1
        failed_dict = obj.errors

        if not obj.is_valid():
            # print(failed_dict["name"])
            # print(failed_dict["name"][0])
            print("錯誤的信息----------->",failed_dict)
            print("名稱的錯誤信息-------->",failed_dict["name"][0])
            print("郵箱的錯誤信息-------->", failed_dict["email"][0])
        return render(request, "login.html", {'xx': obj})
        # return redirect("/app1/login")
    else:
        obj = loginform()
        # return render(request,"login.html")
        # return redirect("/app1/login")
        return render(request,"login.html",{"xx":obj})
    # return HttpResponse("hahh")

  

主要是要看這里

 

 

 

 

 

#Auther Bob
#--*--conding:utf-8 --*--

from django import forms
from django.forms import widgets

class DeatilForm(forms.Form):
    # pwd = forms.CharField(widget=widgets.PasswordInput())
    # user = forms.CharField(widget=widgets.TextInput())
    pwd = forms.CharField(widget=widgets.PasswordInput(attrs={"class":"c1","placeholder":"密碼"}))
    user = forms.CharField(widget=widgets.TextInput(attrs={"class":"c2","placeholder":"用戶名"}))

    age = forms.IntegerField()
    # 這里的效果是輸入框只能輸入數字,其他的都無法輸入

    choice1 = forms.ChoiceField(choices=[(1,"內蒙古"),(2,"廣東"),(3,"黑龍江")])

    choice2 = forms.CharField(
        widget=widgets.Select(choices=[(1,"內蒙古"),(2,"廣東"),(3,"黑龍江")])
    )
    choice3 = forms.IntegerField(
        widget=widgets.Select(choices=[(1,"內蒙古"),(2,"廣東"),(3,"黑龍江")])
    )
    choice4 = forms.IntegerField(
        widget=widgets.RadioSelect(choices=[(1,"內蒙古"),(2,"廣東"),(3,"黑龍江")])
    )

# 進行一下字段學習
class FiledForm(forms.Form):
    arg1 = forms.CharField(

        # 這個屬性是charfiled特有的
        # max_length=233,最大的字符長度
        # min_length=234,最小的字符長度



        # 下面這些屬性是filed都有的,下面參數都可以用下面的參數

        # required=True 是否必填
        # label=None 就是顯示一個字符串,在前台渲染的時候用obj.arg1.label就會顯示label的值,只是一個錦上添花的作用
        # initial=None 這里就是一個默認值,也就是初始值
        # help_text=''這里就是一個幫助信息

        # error_messages=None 出錯的時候顯示的信息

        # show_hidden_initial=False 是否生成帶有默認值的一個隱藏的標簽,可以用來判斷現在的輸入值和默認值是否相同

        # validators=() 自定義一個正則表達式

        # localize=False 是否支持本地化,暫時不需要掌握

        # disabled=False 標簽是否能否能編輯

        # label_suffix=None 默認這個值就是冒號,也就是前面label的值和input框之間的冒號,如果設置了這個值,就會替代lable和input框中之間的冒號

        # error_messages=None
        # error_messages={"required":"不能為空","invalid":"格式錯誤",}

    )
    arg2 = forms.IntegerField(
        # max_value=23,  最大值
        # min_value=21.  最小值
    )

    arg3 = forms.FloatField(

    )

    arg4 = forms.DateField(
        # 頁面必須要滿足這個格式,格式是:2015-09-03
    )

    arg5 = forms.TimeField(
        # 頁面必須要滿足這個格式,格式是:11:34
    )

    arg6 = forms.DateTimeField(
        # 頁面必須要滿足這個格式,格式是:2015-09-03 11:34
    )

    arg7 = forms.EmailField(

    )

    arg8 = forms.PasswordInput(

    )

    arg9 = forms.RegexField(
        # 通過正則表達式自定義字段
    )

    arg10 = forms.FileField(

    )

    arg11 = forms.ImageField(

    )

    # 單選框
    arg12 = forms.ChoiceField(
        initial=2,
        choices=((1,"內蒙古"),(2,"黑龍江"),(3,"廣東"))
    )

    # 多選框
    arg13 = forms.MultipleChoiceField(
        initial=[1,2],
        choices=((1,"內蒙古"),(2,"黑龍江"),(3,"廣東"))
    )

    arg14 = forms.FilePathField(
        # recursive=False 是否遞歸顯示,是否顯示文件下的文件


        # 指定一個路徑,會把這個路徑下所有的文件和路徑用select框顯示出來
    )

    arg15 = forms.GenericIPAddressField(
        # 解析ip地址
    )
    arg16 = forms.SlugField(
        # 只允許輸入,字母數字和下划線減號
    )

    arg17 = forms.UUIDField(
        # 只支持uuid格式的輸入
    )
    # 這里的arg*就是k值

  

 

 

    f8 = fields.ChoiceField(
        choices=[(1, "上海3"), (2, "北京3"), (3, "深圳3")],
        initial=3,
        required=True,
        label="城市",
        label_suffix="------>"
    )

    f9 = fields.TypedChoiceField(
        choices=[(1, "上海4"), (2, "北京4"), (3, "深圳4")],
        initial=3,
        required=True,
        coerce=lambda x:int(x)
    )

    f10 = fields.MultipleChoiceField(
        choices=[(1, "上海5"), (2, "北京5"), (3, "深圳5")],
        initial=[1,3,]
    )

    f11 = fields.TypedMultipleChoiceField(
        choices=[(1, "上海5"), (2, "北京5"), (3, "深圳5")],
        initial=[1, 3, ],
        coerce=lambda x:int(x),
    )

    f12 = fields.FilePathField(path="app1",allow_folders=True,recursive=False,allow_files=)

# recursive:遞歸顯示,true不顯示,false顯示
# allow_folders:是否顯示文件夾
# allow_files:是否顯示文件

    f13 = fields.GenericIPAddressField(
        protocol="both"
    )

    f13 = fields.SlugField()
    # 只允許數字,字母,下划線,減號

  

 widget可以指定插件的類型

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM