欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django之form組件自動(dòng)校驗(yàn)數(shù)據(jù)實(shí)現(xiàn)

 更新時(shí)間:2020年01月14日 08:27:10   作者:辜老板  
這篇文章主要介紹了Django之form組件自動(dòng)校驗(yàn)數(shù)據(jù)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、form介紹

我們之前在HTML頁(yè)面中利用form表單向后端提交數(shù)據(jù)時(shí),都會(huì)寫(xiě)一些獲取用戶輸入的標(biāo)簽并且用form標(biāo)簽把它們包起來(lái)。

與此同時(shí)我們?cè)诤枚鄨?chǎng)景下都需要對(duì)用戶的輸入做校驗(yàn),比如校驗(yàn)用戶是否輸入,輸入的長(zhǎng)度和格式等正不正確。如果用戶輸入的內(nèi)容有錯(cuò)誤就需要在頁(yè)面上相應(yīng)的位置顯示對(duì)應(yīng)的錯(cuò)誤信息.。

Django form組件就實(shí)現(xiàn)了上面所述的功能。

總結(jié)一下,其實(shí)form組件的主要功能如下:

  • 生成頁(yè)面可用的HTML標(biāo)簽
  •  對(duì)用戶提交的數(shù)據(jù)進(jìn)行校驗(yàn)
  • 保留上次輸入內(nèi)容

二、普通方式手寫(xiě)注冊(cè)功能

views.py

# 注冊(cè)
def register(request):
  error_msg = ""
  if request.method == "POST":
    username = request.POST.get("name")
    pwd = request.POST.get("pwd")
    # 對(duì)注冊(cè)信息做校驗(yàn)
    if len(username) < 6:
      # 用戶長(zhǎng)度小于6位
      error_msg = "用戶名長(zhǎng)度不能小于6位"
    else:
      # 將用戶名和密碼存到數(shù)據(jù)庫(kù)
      return HttpResponse("注冊(cè)成功")
  return render(request, "register.html", {"error_msg": error_msg})

register.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>注冊(cè)頁(yè)面</title>
</head>
<body>
<form action="/reg/" method="post">
  {% csrf_token %}
  <p>
    用戶名:
    <input type="text" name="name">
  </p>
  <p>
    密碼:
    <input type="password" name="pwd">
  </p>
  <p>
    <input type="submit" value="注冊(cè)">
    <p style="color: red">{{ error_msg }}</p>
  </p>
</form>
</body>
</html>

三、使用form組件實(shí)現(xiàn)注冊(cè)功能

views.py

先定義好一個(gè)RegForm類:

from django import forms

# 按照Django form組件的要求自己寫(xiě)一個(gè)類
class RegForm(forms.Form):
  name = forms.CharField(label="用戶名")
  pwd = forms.CharField(label="密碼")

再寫(xiě)一個(gè)視圖函數(shù):

# 使用form組件實(shí)現(xiàn)注冊(cè)方式
def register2(request):
  form_obj = RegForm()
  if request.method == "POST":
    # 實(shí)例化form對(duì)象的時(shí)候,把post提交過(guò)來(lái)的數(shù)據(jù)直接傳進(jìn)去
    form_obj = RegForm(request.POST)
    # 調(diào)用form_obj校驗(yàn)數(shù)據(jù)的方法
    if form_obj.is_valid():
      return HttpResponse("注冊(cè)成功")
  return render(request, "register2.html", {"form_obj": form_obj})

register2.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>注冊(cè)2</title>
</head>
<body>
  <form action="/reg2/" method="post" novalidate autocomplete="off">
    {% csrf_token %}
    <div>
      <label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}</label>
      {{ form_obj.name }} {{ form_obj.name.errors.0 }}
    </div>
    <div>
      <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
      {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
    </div>
    <div>
      <input type="submit" class="btn btn-success" value="注冊(cè)">
    </div>
  </form>
</body>
</html>

看網(wǎng)頁(yè)效果發(fā)現(xiàn) 也驗(yàn)證了form的功能:

  • 前端頁(yè)面是form類的對(duì)象生成的 -->生成HTML標(biāo)簽功能
  • 當(dāng)用戶名和密碼輸入為空或輸錯(cuò)之后 頁(yè)面都會(huì)提示 -->用戶提交校驗(yàn)功能
  • 當(dāng)用戶輸錯(cuò)之后 再次輸入 上次的內(nèi)容還保留在input框 -->保留上次輸入內(nèi)容

四、pycharm的專屬測(cè)試環(huán)境

1.使用方法

1.導(dǎo)入要測(cè)試的py文件

2.生成一個(gè)對(duì)象

2.本地校驗(yàn)測(cè)試的一些參數(shù)

from_obj.is_valid()     //判斷校驗(yàn)是否通過(guò)
from_obj.cleaned_data    //拿到當(dāng)前符號(hào)校驗(yàn)的數(shù)據(jù){'username': '111', 'password': '111'}
form_obj.errors       //拿到當(dāng)前校驗(yàn)不通過(guò)的數(shù)據(jù)

少傳參數(shù)Flalse,多傳Trun。因?yàn)樯賯髁四貌坏叫r?yàn)的數(shù)據(jù),多傳了也不會(huì)使用。這是字典的形式

五、html自動(dòng)生成input用戶輸入框的三種方式

forms組件只幫你渲染獲取用戶輸入(輸入 選擇 下拉 文件)的標(biāo)簽 不渲染按鈕和form表單標(biāo)簽

渲染出來(lái)的每一個(gè)input提示信息都是類中字段首字母大寫(xiě)

class MyRegForm(forms.Form):
  username = forms.CharField(max_length=8, min_length=3) # 最長(zhǎng)8位,最短3位
  password = forms.CharField(max_length=8, min_length=3) # 最長(zhǎng)8位,最短3位
  email = forms.EmailField() # 郵箱驗(yàn)證
  
def reg(request):
  # 1 先生成一個(gè)空的類對(duì)象
  form_obj = MyRegForm()
  if request.method == 'POST':
    # 3 獲取用戶數(shù)據(jù)并交給forms組件校驗(yàn) request.POST
    form_obj = MyRegForm(request.POST)
    # 4 獲取校驗(yàn)結(jié)果
    if form_obj.is_valid():
      return HttpResponse('數(shù)據(jù)沒(méi)問(wèn)題')
    else:
      # 5 獲取校驗(yàn)失敗的字段和提示信息
      print(form_obj.errors)
  # 2 直接將該對(duì)象傳給前端頁(yè)面
  return render(request, 'reg.html', locals())

第一種方式 {{ form_obj.as_p }} (不推薦)

不推薦,封裝程度高,擴(kuò)展性低。一般測(cè)試本地用

<body>
<p>第一種渲染方式:多個(gè)p標(biāo)簽 本地測(cè)試方便 封裝程度太高了 不便于擴(kuò)展</p>
{{ form_obj.as_p }}
{#{{ form_obj.as_ul }}#}
{#{{ form_obj.as_table }}#}
</body>

第二種方式 {{ form_obj.username }} (不推薦)

不推薦,擴(kuò)展性較高 ,書(shū)寫(xiě)較為繁瑣,每一個(gè)input框都需要自己手動(dòng)寫(xiě)

<p>第二種渲染方式: 擴(kuò)展性較高 書(shū)寫(xiě)較為繁瑣</p>
<label for="{{ form_obj.username.id_for_label }}">{{ form_obj.username.label }}</label>
{{ form_obj.username }}
{{ form_obj.password.label }}{{ form_obj.password }}
{{ form_obj.email.label }}{{ form_obj.email }}

第三種方式 for循環(huán) (推薦)

推薦使用,for循環(huán)方式

{{ form.errors.0 }} # 這個(gè)是模板語(yǔ)法

<p>第三種渲染方式 推薦使用</p>
<form action="" method="post" novalidate>
  {% for form in form_obj %}
  <p>
    {{ form.label }}{{ form }}
    <span>{{ form.errors.0 }}</span>
  </p>
  {% endfor %}
  <input type="submit">
</form>

六、數(shù)據(jù)校驗(yàn)

*******數(shù)據(jù)校驗(yàn)一個(gè)前后端都得有 但是前端的校驗(yàn)弱不禁風(fēng) 可有可無(wú)

而后端的校驗(yàn)則必須非常全面

如何取消瀏覽器自動(dòng)幫我們校驗(yàn)的功能?

在form后加參數(shù) no validate,不驗(yàn)證

form表單取消前端瀏覽器自動(dòng)校驗(yàn)功能 
  <form action="" method="post" novalidate>

常用校驗(yàn)參數(shù)

max_length //允許輸入的最大長(zhǎng)度
min_length //最小長(zhǎng)度
label input的提示信息,name、password等
error_messages 自定義報(bào)錯(cuò)的提示信息
'max_length':"用戶名最長(zhǎng)8位",
'min_length':"用戶名最短3位",
'required':"用戶名不能為空"
required 設(shè)置字段是否允許為空
initial 設(shè)置默認(rèn)值
widget 控制type類型及屬性

使用方式

CharField用戶名類型校驗(yàn)

from django.forms import widgets  //不導(dǎo)入也可以,沒(méi)提示

class MyRegForm(forms.Form):
  # 用戶名最少3位最多8位
  username = forms.CharField(max_length=8,min_length=3,label='用戶名',
                error_messages={   //報(bào)錯(cuò)信息的提示
                  'max_length':"用戶名最長(zhǎng)8位",
                  'min_length':"用戶名最短3位",
                  'required':"用戶名不能為空"
                },required=False,initial='jeff', // 為空和默認(rèn)值
                widget=forms.widgets.TextInput(attrs={'class':'form-control c1 c2'}),    //設(shè)置input的type屬性為text,及class屬性
                )

password校驗(yàn)

class LoginForm(forms.Form):
  ...
  pwd = forms.CharField(
    min_length=6,
    label="密碼",
    widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
  )

郵箱類型校驗(yàn)

class MyRegForm(forms.Form):
  # email字段必須填寫(xiě)符合郵箱格式的數(shù)據(jù)
  email = forms.EmailField(label='郵箱',error_messages={
    'required':'郵箱必填',
    'invalid':'郵箱格式不正確'
  })

手機(jī)號(hào)類型校驗(yàn)

正則匹配

from django.core.validators import RegexValidator
class MyRegForm(forms.Form):
  # 手機(jī)號(hào)
  phone = forms.CharField(
    validators=[
      RegexValidator(r'^[0-9]+$', '請(qǐng)輸入數(shù)字'),  
      RegexValidator(r'^159[0-9]+$', '數(shù)字必須以159開(kāi)頭')
    ]
  )

性別校驗(yàn)

  gender = forms.ChoiceField(
    choices=((1, "男"), (2, "女"), (3, "保密")),
    label="性別",
    initial=3,
    widget=forms.widgets.RadioSelect()
  )

愛(ài)好單選 select校驗(yàn)

  hobby = forms.ChoiceField(
    choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),
    label="愛(ài)好",
    initial=3,
    widget=forms.widgets.Select()  # 單選
  )

愛(ài)好多選select 校驗(yàn)1

  hobby1 = forms.MultipleChoiceField(
    choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),
    label="愛(ài)好",
    initial=[1, 3],
    widget=forms.widgets.SelectMultiple()
  )

愛(ài)好多選chekbox校驗(yàn)2

 hobby2 = forms.MultipleChoiceField(
    choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),
    label="愛(ài)好",
    initial=[1, 3],
    widget=forms.widgets.CheckboxSelectMultiple()
  )

是否記住密碼校驗(yàn)

  keep = forms.ChoiceField(
    label="是否記住密碼",
    initial="checked",
    widget=forms.widgets.CheckboxInput()
  )

七、鉤子函數(shù)

# 如果你想同時(shí)操作多個(gè)字段的數(shù)據(jù)你就用全局鉤子
# 如果你想操作單個(gè)字段的數(shù)據(jù) 你就用局部鉤子
鉤子勾回來(lái)處理完之后,還要還回去的

局部鉤子

校驗(yàn)用戶名中不能包含666

# 局部鉤子
# 這里的self是自己類,MyRegForm
  def clean_username(self):
    username = self.cleaned_data.get('username')
    if '666' in username:
      self.add_error('username','光喊666是不行的')
    return username

全局鉤子

兩次密碼驗(yàn)證

class MyRegForm(forms.Form):
  # 密碼
  password = forms.CharField(max_length=8,min_length=3,label='密碼',
                widget=forms.widgets.PasswordInput(attrs={'class':'form-control'})
               )
  # 密碼驗(yàn)證
  re_password = forms.CharField(max_length=8,min_length=3,label='確認(rèn)密碼',
                widget=forms.widgets.PasswordInput(attrs={'class':'form-control'})
                 )

  def clean(self):
    # 這里的self是自己類,MyRegForm
    # 校驗(yàn)密碼和確認(rèn)密碼是否一致
    password = self.cleaned_data.get('password')
    re_password = self.cleaned_data.get('confirm_password')
    if not password == re_password:
      # 展示提示信息
      self.add_error('re_password','兩次密碼不一致')
      return self.cleaned_data

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

相關(guān)文章

  • .img/.hdr格式轉(zhuǎn).nii格式的操作

    .img/.hdr格式轉(zhuǎn).nii格式的操作

    這篇文章主要介紹了.img/.hdr格式轉(zhuǎn).nii格式的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • python實(shí)現(xiàn)簡(jiǎn)易猜數(shù)小游戲

    python實(shí)現(xiàn)簡(jiǎn)易猜數(shù)小游戲

    大家好,本篇文章主要講的是python實(shí)現(xiàn)簡(jiǎn)易猜數(shù)小游戲,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 在python中修改.properties文件的操作

    在python中修改.properties文件的操作

    這篇文章主要介紹了在python中修改.properties文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • 使用Python實(shí)現(xiàn)在Windows下安裝Django

    使用Python實(shí)現(xiàn)在Windows下安裝Django

    今天小編就為大家分享一篇關(guān)于使用Python實(shí)現(xiàn)在Windows下安裝Django,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • python判斷元素是否存在的實(shí)例方法

    python判斷元素是否存在的實(shí)例方法

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于python判斷元素是否存在的實(shí)例方法,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-09-09
  • Python中的單行、多行、中文注釋方法

    Python中的單行、多行、中文注釋方法

    今天小編就為大家分享一篇Python中的單行、多行、中文注釋方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 詳解Python中for循環(huán)的使用方法

    詳解Python中for循環(huán)的使用方法

    這篇文章主要介紹了Python中for循環(huán)的使用方法,是Python入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • python粘包的解決方案

    python粘包的解決方案

    粘包就是在數(shù)據(jù)傳輸過(guò)程中有多個(gè)數(shù)據(jù)包被粘連在一起被發(fā)送或接受,本文主要介紹了python粘包的解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • python 多個(gè)參數(shù)不為空校驗(yàn)方法

    python 多個(gè)參數(shù)不為空校驗(yàn)方法

    今天小編就為大家分享一篇python 多個(gè)參數(shù)不為空校驗(yàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • python3 tcp的粘包現(xiàn)象和解決辦法解析

    python3 tcp的粘包現(xiàn)象和解決辦法解析

    這篇文章主要介紹了python3 tcp的粘包現(xiàn)象和解決辦法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論