最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django做form表單的數(shù)據(jù)驗(yàn)證過(guò)程詳解

 更新時(shí)間:2019年07月26日 15:35:15   作者:bainianminguo  
這篇文章主要介紹了django做form表單的數(shù)據(jù)驗(yàn)證過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

我們之前寫的代碼都沒有對(duì)前端input框輸入的數(shù)據(jù)做驗(yàn)證,我們今天來(lái)看下,如果做form表單的數(shù)據(jù)的驗(yàn)證

在views文件做驗(yàn)證

首先用文字描述一下流程

1、在views文件中導(dǎo)入forms模塊

2、然后創(chuàng)建一個(gè)類,繼承forms.form

3、然后在這個(gè)類中寫變量,這個(gè)變量的就是input標(biāo)簽中的name,也就是前端往后端傳遞的k值,我們就可以對(duì)這個(gè)k值對(duì)應(yīng)的v值做數(shù)據(jù)內(nèi)容的校驗(yàn),比如是郵箱模式,比如是否允許空,最大字段長(zhǎng)度,最小字段長(zhǎng)度

4、然后在視圖函數(shù)中,實(shí)例化一個(gè)步驟3中的類,然后用這個(gè)對(duì)象去接受request.post中的值,然后對(duì)象就會(huì)根據(jù)post方式傳遞來(lái)的k值和類中的k對(duì)應(yīng),然后比較post傳遞過(guò)來(lái)的v值是否符合規(guī)范

1、先導(dǎo)入forms模塊

from django import forms

2、創(chuàng)建模板的類

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

這里這個(gè)error_messages寫出錯(cuò)的信息,每個(gè)不同的錯(cuò)誤碼對(duì)應(yīng)不同的報(bào)錯(cuò)信息

3、在視圖函數(shù)中使用這個(gè)類

def login(request):
  if request.method.lower() == "post":
    # 3、創(chuàng)建一個(gè)模板的對(duì)象,然后把數(shù)據(jù)傳遞個(gè)這個(gè)對(duì)象
    obj = loginform(request.POST)
 
    # 4、啟動(dòng)校驗(yàn)
 
    status= obj.is_valid()
    print(status)
 
    # 5、正確的信息
    success_dict = obj.clean()
    print(success_dict)
 
    # 6、錯(cuò)誤的信息
    failed_dict = obj.errors.as_json()
    print(failed_dict)
    return redirect("/app1/login")
  else:
    return render(request,"login.html")

這里就會(huì)校驗(yàn)前臺(tái)發(fā)來(lái)的數(shù)據(jù)中,k為name和email的值的合法性

因?yàn)槭莊orm表單,所以提交后頁(yè)面會(huì)刷新,上次輸入的數(shù)據(jù)就沒有了,我們可以通過(guò)下面的方式實(shí)現(xiàn)保留上次輸入的值

前端代碼

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>form提交測(cè)試</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、創(chuàng)建模板
class loginform(forms.Form):
  # 2、模板中的元素
  name = forms.CharField(min_length=6,error_messages={"required":"用戶名不能為空","min_length":"最小長(zhǎng)度為6666666666"})
  # requird這個(gè)是錯(cuò)誤碼
 
  email = forms.EmailField(error_messages={"required":"郵箱不能為空","invalid":"郵箱格式錯(cuò)誤"})
 
def login(request):
  if request.method.lower() == "post":
    # 3、創(chuàng)建一個(gè)模板的對(duì)象,然后把數(shù)據(jù)傳遞個(gè)這個(gè)對(duì)象
    obj = loginform(request.POST)
 
    # 4、啟動(dòng)校驗(yàn)
 
    status= obj.is_valid()
    print(status)
 
    # 5、正確的信息
    success_dict = obj.clean()
    print("正確的信息----------->",success_dict)
 
    # 6_1、錯(cuò)誤的信息1
    # failed_dict = obj.errors.as_json()
 
    # 6_2、錯(cuò)誤的信息1
    failed_dict = obj.errors
 
    if not obj.is_valid():
      # print(failed_dict["name"])
      # print(failed_dict["name"][0])
      print("錯(cuò)誤的信息----------->",failed_dict)
      print("名稱的錯(cuò)誤信息-------->",failed_dict["name"][0])
      print("郵箱的錯(cuò)誤信息-------->", 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()
  # 這里的效果是輸入框只能輸入數(shù)字,其他的都無(wú)法輸入
 
  choice1 = forms.ChoiceField(choices=[(1,"內(nèi)蒙古"),(2,"廣東"),(3,"黑龍江")])
 
  choice2 = forms.CharField(
    widget=widgets.Select(choices=[(1,"內(nèi)蒙古"),(2,"廣東"),(3,"黑龍江")])
  )
  choice3 = forms.IntegerField(
    widget=widgets.Select(choices=[(1,"內(nèi)蒙古"),(2,"廣東"),(3,"黑龍江")])
  )
  choice4 = forms.IntegerField(
    widget=widgets.RadioSelect(choices=[(1,"內(nèi)蒙古"),(2,"廣東"),(3,"黑龍江")])
  )
 
# 進(jìn)行一下字段學(xué)習(xí)
class FiledForm(forms.Form):
  arg1 = forms.CharField(
 
    # 這個(gè)屬性是charfiled特有的
    # max_length=233,最大的字符長(zhǎng)度
    # min_length=234,最小的字符長(zhǎng)度
 
 
 
    # 下面這些屬性是filed都有的,下面參數(shù)都可以用下面的參數(shù)
 
    # required=True 是否必填
    # label=None 就是顯示一個(gè)字符串,在前臺(tái)渲染的時(shí)候用obj.arg1.label就會(huì)顯示label的值,只是一個(gè)錦上添花的作用
    # initial=None 這里就是一個(gè)默認(rèn)值,也就是初始值
    # help_text=''這里就是一個(gè)幫助信息
 
    # error_messages=None 出錯(cuò)的時(shí)候顯示的信息
 
    # show_hidden_initial=False 是否生成帶有默認(rèn)值的一個(gè)隱藏的標(biāo)簽,可以用來(lái)判斷現(xiàn)在的輸入值和默認(rèn)值是否相同
 
    # validators=() 自定義一個(gè)正則表達(dá)式
 
    # localize=False 是否支持本地化,暫時(shí)不需要掌握
 
    # disabled=False 標(biāo)簽是否能否能編輯
 
    # label_suffix=None 默認(rèn)這個(gè)值就是冒號(hào),也就是前面label的值和input框之間的冒號(hào),如果設(shè)置了這個(gè)值,就會(huì)替代lable和input框中之間的冒號(hào)
 
    # error_messages=None
    # error_messages={"required":"不能為空","invalid":"格式錯(cuò)誤",}
 
  )
  arg2 = forms.IntegerField(
    # max_value=23, 最大值
    # min_value=21. 最小值
  )
 
  arg3 = forms.FloatField(
 
  )
 
  arg4 = forms.DateField(
    # 頁(yè)面必須要滿足這個(gè)格式,格式是:2015-09-03
  )
 
  arg5 = forms.TimeField(
    # 頁(yè)面必須要滿足這個(gè)格式,格式是:11:34
  )
 
  arg6 = forms.DateTimeField(
    # 頁(yè)面必須要滿足這個(gè)格式,格式是:2015-09-03 11:34
  )
 
  arg7 = forms.EmailField(
 
  )
 
  arg8 = forms.PasswordInput(
 
  )
 
  arg9 = forms.RegexField(
    # 通過(guò)正則表達(dá)式自定義字段
  )
 
  arg10 = forms.FileField(
 
  )
 
  arg11 = forms.ImageField(
 
  )
 
  # 單選框
  arg12 = forms.ChoiceField(
    initial=2,
    choices=((1,"內(nèi)蒙古"),(2,"黑龍江"),(3,"廣東"))
  )
 
  # 多選框
  arg13 = forms.MultipleChoiceField(
    initial=[1,2],
    choices=((1,"內(nèi)蒙古"),(2,"黑龍江"),(3,"廣東"))
  )
 
  arg14 = forms.FilePathField(
    # recursive=False 是否遞歸顯示,是否顯示文件下的文件
 
 
    # 指定一個(gè)路徑,會(huì)把這個(gè)路徑下所有的文件和路徑用select框顯示出來(lái)
  )
 
  arg15 = forms.GenericIPAddressField(
    # 解析ip地址
  )
  arg16 = forms.SlugField(
    # 只允許輸入,字母數(shù)字和下劃線減號(hào)
  )
 
  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()
  # 只允許數(shù)字,字母,下劃線,減號(hào)

widget可以指定插件的類型

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決Django一個(gè)表單對(duì)應(yīng)多個(gè)按鈕的問(wèn)題

    解決Django一個(gè)表單對(duì)應(yīng)多個(gè)按鈕的問(wèn)題

    今天小編就為大家分享一篇解決Django一個(gè)表單對(duì)應(yīng)多個(gè)按鈕的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python導(dǎo)入其他文件夾中函數(shù)的實(shí)現(xiàn)方法

    Python導(dǎo)入其他文件夾中函數(shù)的實(shí)現(xiàn)方法

    本文主要介紹了Python導(dǎo)入其他文件夾中函數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 使用Python將.py文件轉(zhuǎn)換為PDF并實(shí)現(xiàn)語(yǔ)法高亮

    使用Python將.py文件轉(zhuǎn)換為PDF并實(shí)現(xiàn)語(yǔ)法高亮

    在開發(fā)工作中,我們經(jīng)常需要分享或歸檔 Python 腳本文件,.py 文件雖然在編輯器中可讀性強(qiáng),但直接發(fā)送給他人時(shí),缺乏格式統(tǒng)一、排版美觀,且打印體驗(yàn)不佳,Python 生態(tài)中有多種方式可以實(shí)現(xiàn)代碼轉(zhuǎn) PDF,本文將介紹兩種常見的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2025-12-12
  • python實(shí)現(xiàn)計(jì)算圖形面積

    python實(shí)現(xiàn)計(jì)算圖形面積

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)計(jì)算圖形面積,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Django壓縮靜態(tài)文件的實(shí)現(xiàn)方法詳析

    Django壓縮靜態(tài)文件的實(shí)現(xiàn)方法詳析

    最近在學(xué)習(xí)Django配置靜態(tài)文件,下面這篇文章主要給大家介紹了關(guān)于Django壓縮靜態(tài)文件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Python?全局空間和局部空間

    Python?全局空間和局部空間

    這篇文章主要介紹了Python?全局空間和局部空間,命名空間的概念的提出是為了劃分和控制變量是否可見,以及生存周期的長(zhǎng)短;命名空間的作用范圍叫做作用域更多詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • 聊聊Python中的pypy

    聊聊Python中的pypy

    這篇文章主要介紹了聊聊Python中的pypy,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 詳解python 支持向量機(jī)(SVM)算法

    詳解python 支持向量機(jī)(SVM)算法

    這篇文章主要介紹了python SVM算法的相關(guān)資料,幫助大家更好的利用python進(jìn)行數(shù)據(jù)分析,感興趣的朋友可以了解下
    2020-09-09
  • Python快速搭建一個(gè)高效的數(shù)據(jù)存儲(chǔ)系統(tǒng)的實(shí)戰(zhàn)指南

    Python快速搭建一個(gè)高效的數(shù)據(jù)存儲(chǔ)系統(tǒng)的實(shí)戰(zhàn)指南

    在當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,高效的數(shù)據(jù)存儲(chǔ)系統(tǒng)已成為任何成功應(yīng)用的基石,本文將深入探討如何使用Python快速搭建一個(gè)高效的數(shù)據(jù)存儲(chǔ)系統(tǒng),感興趣的小伙伴可以了解下
    2025-10-10
  • 零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟

    零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟

    這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論

临漳县| 涪陵区| 行唐县| 汕头市| 永吉县| 郸城县| 余庆县| 皋兰县| 建昌县| 德安县| 沁水县| 桃江县| 成都市| 翁源县| 阿拉善右旗| 南召县| 百色市| 泸溪县| 凤凰县| 逊克县| 广宗县| 咸宁市| 莆田市| 靖边县| 隆安县| 嵊泗县| 北辰区| 平塘县| 始兴县| 呼图壁县| 黄陵县| 威海市| 林西县| 麻阳| 新兴县| 城市| 南雄市| 吉隆县| 周宁县| 奇台县| 舒城县|