Django--Forms組件使用

Forms組件的使用

在html表單驗證中,需要通過各種信息的驗證,比如注冊界面的姓名、密碼、郵箱、電話等的驗證,是否符合定義好的規則,不可能每次都要取出對應的字段一一判斷,django內置了Forms組件,可以方便的在HTML中進行校驗等信息設置

1.Forms組件的作用

1.數據校驗

2.渲染頁面

3.渲染錯誤信息

4.使用局部或者全局的鉤子函數

5.設置CSS樣式

2.Forms組件的使用

  • 1.導入froms模塊 from django import forms
  • 2.定義一個類繼承自forms.Form,編寫校驗的字段,該字段就是html頁面上提交數據上傳的字段
class RegisterForms(Form):# 添加的字段類型中的屬性,每個子類都繼承自field,#field中對應的屬性和釋義#required=True,               是否是必須驗證,默認為True#widget=None,                 HTML插件,添加類名,設置placeholder等等#label=None,                  用于生成Label標簽或顯示內容#initial=None,                初始值#help_text='',                幫助信息(在標簽旁邊顯示)#error_messages=None,         錯誤信息 {'required': '不能為空', 'invalid': '格式錯誤'}#validators=[],               自定義驗證規則#localize=False,              是否支持本地化#disabled=False,              是否可以編輯#label_suffix=None            Label內容后綴name = forms.CharField(min_length=3,max_length=8,label="用戶名",error_messages={'min_length':'用戶名最少為3位','max_length':'用戶名最多8位','required':'名稱不能為空'})pwd = forms.CharField(min_length=6, max_length=20,label='請輸入密碼',error_messages={'min_length':'密碼最少為6位','max_length':'密碼最多20位','required':'密碼不能為空'})re_pwd = forms.CharField(min_length=6, max_length=20,label='請確認密碼',error_messages={'min_length':'密碼最少為6位','max_length':'密碼最多20位','required':'密碼不能為空'})phone = forms.CharField(label="請輸入手機號碼",error_messages={'placerholder': '請輸入手機號碼'})email = forms.EmailField(label='請輸入郵箱',required=False,error_messages={'invalid':'郵箱格式不合法','max_length':'密碼最多20位'}) 
# 對于多傳的字段不會出錯,cleaned_data中不包含多傳的字段
# 少傳的字段會報錯,相當于對應的字段沒有值
  • 3.在對應的views視圖中進行校驗,
def form_index(request):post_forms = RegisterForms()error = ''if request.method == 'POST':post_forms = RegisterForms(request.POST)# 4 調用forms的is_valid方法,完成校驗,is_valid返回true或者falseif post_forms():register = post_forms.cleaned_dataprint(register)return HttpResponse('注冊成功')else:from django.forms.utils import ErrorDict# 獲取全局的error信息,只顯示第一個if post_forms.errors.get('__all__'):error = post_forms.errors.get('__all__')[0]return render(request, 'FormsTest/forms_index.html',locals())
  • 4.通過模板渲染,渲染模板有如下幾種方式,具體使用如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>forms登錄</title>{% load static %}<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"><script src="{% static 'jquery-3.3.1.js' %}"></script><style>.edit-author{margin: 100px 300px;}.errorinfo{color: red;font-size: 15px;padding-left: 15px;}</style>
</head>
<body><div class="edit-author">
{#    <form action="" method="post">#}
{#        {% csrf_token %}#}
{#        <div class="form-group">#}
{#            <label for="exampleInputEmail1">用戶名</label>#}
{#            <input type="text" name="name" class="form-control" placeholder="請輸入用戶名" >#}
{#        </div>#}
{#        <div class="form-group">#}
{#            <label for="exampleInputPassword1">密碼</label>#}
{#            <input type="password" name="pwd" class="form-control" placeholder="請輸入密碼">#}
{#        </div>#}
{#        <div class="form-group">#}
{#            <label for="exampleInputPassword1">確認密碼</label>#}
{#            <input type="password" name="re_pwd" class="form-control" placeholder="請確認密碼">#}
{#        </div>#}
{#        <div class="form-group">#}
{#            <label for="exampleInputPassword1">郵箱</label>#}
{#            <input type="email" name="email" class="form-control" placeholder="請輸入郵箱">#}
{#        </div>#}
{##}
{#        <button type="submit" id="clickBtn" class="btn btn-default submit-button">注冊</button>#}
{#        <span id="error"></span>#}
{#    </form>#}{#    forms渲染頁面第一種方式#}
{#    <form action="" method="post">#}
{#        {% csrf_token %}#}
{#        <div class="form-group">#}
{#            <label for="exampleInputEmail1">用戶名</label>#}
{#            {{ post_forms.name }}#}
{#        </div>#}
{#        <div class="form-group">#}
{#            <label for="exampleInputPassword1">密碼</label>#}
{#            {{ post_forms.pwd }}#}
{#        </div>#}
{#        <div class="form-group">#}
{#            <label for="exampleInputPassword1">確認密碼</label>#}
{#            {{ post_forms.re_pwd }}#}
{#        </div>#}
{#        <div class="form-group">#}
{#            <label for="exampleInputPassword1">郵箱</label>#}
{#            {{ post_forms.email }}#}
{#        </div>#}
{#        <button type="submit" id="clickBtn" class="btn btn-default submit-button">注冊</button>#}
{#    </form>#}{#    forms渲染頁面第二種方式,推薦使用#}<form action="" method="post" novalidate>{% csrf_token %}{% for foo in reg_forms %}<div class="form-group">{# errors是一個列表,一般取第一個就可以了,這樣不會換行處理#}<label for="exampleInputEmail1">{{ foo.label }}</label><span class="errorinfo"> {{ foo.errors.0 }}</span>{{ foo }}</div>{% endfor %}<button type="submit" id="clickBtn" class="btn btn-default submit-button">注冊</button><span class="errorinfo">{{ error }} </span></form>{#    forms渲染頁面第二種方式,不推薦使用#}
{#    <form action="" method="post">#}
{#        {% csrf_token %}#}
{#        {{ post_forms.as_p }}#}
{#        {{ post_forms.as_ul }}#}
{#        {{ post_forms.as_table }}#}
{#        <button type="submit" id="clickBtn" class="btn btn-default submit-button">注冊</button>#}
{#    </form>#}</div></body>
</html>

如圖展示類容

  • 5.上面只是實現了部分的校驗,而且展示的樣式需要手動渲染,我們可以在定義模型的時候直接設置好對應的css展示樣式和自定義校驗規則,比如電話號碼的正則校驗等等
#導入widgets模塊,設置css的展示樣式
from django.forms import widgets#接下來修改對應的name,pwd,phone等字段,添加新屬性,如下添加了占位符和類名這個時候的登錄界面就和上面的一樣name = forms.CharField(min_length=3,max_length=8,label="用戶名",widget=widgets.TextInput(attrs={'class': 'form-control','placeholder': '請輸入名稱(3-8字符)'}),error_messages={'min_length':'用戶名最少為3位','max_length':'用戶名最多8位','required':'名稱不能為空'})pwd = forms.CharField(min_length=6, max_length=20,label='請輸入密碼',widget=widgets.PasswordInput(attrs={'class':'form-control','placeholder':'請輸入密碼(6-20字符)'}),error_messages={'min_length':'密碼最少為6位','max_length':'密碼最多20位','required':'密碼不能為空'})re_pwd = forms.CharField(min_length=6, max_length=20,label='請確認密碼',widget=widgets.PasswordInput(attrs={'class': 'form-control','placeholder': '請確認密碼'}),error_messages={'min_length':'密碼最少為6位','max_length':'密碼最多20位','required':'密碼不能為空'})phone = forms.CharField(label="請輸入手機號碼",widget=widgets.TextInput(attrs={'class': 'form-control','placeholder': '請輸入手機號碼'}),error_messages={'placerholder': '請輸入手機號碼'})email = forms.EmailField(label='請輸入郵箱',required=False,widget=widgets.TextInput(attrs={'class': 'form-control','placeholder': '請輸入郵箱'}),error_messages={'invalid':'郵箱格式不合法','max_length':'密碼最多20位'})
  • 6.自定義校驗規則,有時django自帶的校驗并不能滿足我們所有的需求,比如校驗密碼輸入,不能用特殊字符,手機號碼格式定義正則等,這就需要我們自定義規則
#自定義校驗規則
def mobile_validate(value):mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')if not mobile_re.match(value):raise ValidationError('手機號碼格式錯誤')#在定義字段的時候添加校驗規則,校驗規則傳入的是一個列表,可以有多個校驗規則
phone = forms.CharField(label="請輸入手機號碼",validators=[mobile_validate,],widget=widgets.TextInput(attrs={'class': 'form-control','placeholder': '請輸入手機號碼'}),error_messages={'placerholder': '請輸入手機號碼'})
  • 7.自定義鉤子,實現自定義的錯誤提示和校驗規則,
#Django中鉤子分為局部鉤子和全局鉤子,
# 局部鉤子函數(某個字段,自定義的規則,數據庫是否存在,以什么開頭)
# 方法名必須為:clean_字段名
def clean_name(self):#獲取到當前對象,是cleaned_data之后的數據name = self.cleaned_data.get('name')if name.startswith('sb'):#以sb開頭了返回錯誤信息,禁止使用sb開頭的用戶名raise ValidationError('不能以sb開頭')# 數據庫中查詢有沒有這個名稱user = models.UserInfo.objects.filter(username=name).first()if user:raise ValidationError('用戶名已存在')return name#全局鉤子,方法名必須是clean
#校驗兩次密碼是否相同等,
def clean(self):pwd = self.cleaned_data.get('pwd')re_pwd = self.cleaned_data.get('re_pwd')if pwd == re_pwd:return self.cleaned_dataelse:raise ValidationError('兩次密碼不一致')

3.最后實現的效果如下圖

543387-20190620132320954-2085309689.gif

轉載于:https://www.cnblogs.com/zj901203/p/11057612.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448672.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448672.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448672.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

yii2關聯表

asArray()這個方法很好用&#xff0c;返回數組是1版本想要的形式&#xff0c;這種方式有種tp框架的感覺轉載于:https://www.cnblogs.com/peipeiyu/p/10974487.html

詳細程序注解學OpenCL一 環境配置和入門程序

本專欄是通過注解程序的方法學習OpenCL&#xff0c;我覺得一個一個地去摳原理也不是辦法&#xff0c;干脆直接學習程序&#xff0c;然后把相關原理都直接注解到程序語句當中。 原創地址&#xff1a;http://blog.csdn.net/kenden23/article/details/14101657 一開始要配置好環境…

解決 IDEA 在 commit 代碼時 git 日志亂碼 (提交時填寫的中文說明亂碼)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.問題描述&#xff1a; idea 開發代碼中的 中文正常&#xff0c;但提交到碼云時填寫的提交日志是亂碼。 提交到碼云后是這樣的&#…

Box 類

public class Box extends JComponent implements Accessible使用 BoxLayout 對象作為其布局管理器的一個輕量級容器。Box 提供幾個對使用 BoxLayout 的容器&#xff08;甚至非 Box 容器&#xff09;有用的類方法。 Box 類可以創建幾種影響布局的不可見組件&#xff1a;glue、s…

神奇的pdfkit工具——將字符串保存為pdf文件

神奇的pdfkit工具——將字符串保存為pdf文件 1、安裝工具包 pip install pdfkit 2、上干貨 import pdfkitdef create_pdf(str_data, to_file):將字符串生成pdf文件 # &#xff08;需下載wkhtmltox&#xff09;將程序路徑傳入config對象config pdfkit.configuration(wkhtmltopd…

OpenCL結構

原標題&#xff1a;從零開始學習OpenCL開發&#xff08;一&#xff09;架構 1 異構計算、GPGPU與OpenCL OpenCL是當前一個通用的由很多公司和組織共同發起的多CPU\GPU\其他芯片 異構計算&#xff08;heterogeneous&#xff09;的標準&#xff0c;它是跨平臺的。旨在充分利用GP…

docker-compose 使用小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 只是一個很簡單的小例。 1. 原本有的容器 2. docker-compose.yml 寫法&#xff1a; gentle 處可以任意寫&#xff0c;gentle 是我的項…

2019.6.20

今日內容 MongoDB可視化工具 一、Scrapy爬蟲框架 二、微信機器人 轉載于:https://www.cnblogs.com/jrc123/p/11062606.html

PCL點云 Lebel:Research

https://blog.csdn.net/wokaowokaowokao12345/article/details/73741957 https://blog.csdn.net/u010696366/article/category/3108337轉載于:https://www.cnblogs.com/radiumlrb/p/10986918.html

AMD GPU+VS2010的OpenCL配置

安裝開發環境可以參照DE4-530的OpenCL開發環境搭建&#xff08;最終版&#xff09;&#xff0c;這篇文章的大部分內容轉載自&#xff1a;http://www.verydemo.com/demo_c92_i226325.html AMD的Heterogeneous Computing有很多AMD的OpenCL資料&#xff0c;包括各種分析工具&#…

ABP開發框架前后端開發系列---(9)ABP框架的權限控制管理

在前面兩篇隨筆《ABP開發框架前后端開發系列---&#xff08;7&#xff09;系統審計日志和登錄日志的管理》和《ABP開發框架前后端開發系列---&#xff08;8&#xff09;ABP框架之Winform界面的開發過程》開始介紹了權限管理的內容&#xff0c;其中只是列出了內部的權限系統的審…

GIL , 線程池 , 同步 , 異步 , 隊列 , 事件

一.什么是GIL 官方解釋:In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (Howev…

Docker - Compose 使用說明、詳解docker-compose

Compose 模板文件 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 模板文件是使用 Compose 的核心&#xff0c;涉及到的指令關鍵字也比較多。但大家不用擔心&#xff0c;這里面大部分指令…

在Windows下使用OpenCL配置

前言 目前&#xff0c;NVIDIA 和 AMD 的 Windows driver 均有支持OpenCL&#xff08;NVIDIA 的正式版 driver 是從自195.62 版開始&#xff0c;而 AMD則是從9.11 版開始&#xff09;。NVIDIA 的正式版 driver 中包含 OpenCL.dll&#xff0c;因此可以直接使用。AMD 到目前為止…

Linux下啟動mongodb

完成安裝mongodb&#xff08;略&#xff09; 創建數據目錄&#xff1a; # mkdir /data/mongo 創建配置文件 # vi /data/mongo/mongodb.cnf dbpath/data/mongo/ logpath/data/mongo/mongo.log logappendtrue forktrue port27017 或者&#xff1a;不創建配置文件通過mongod參數啟…

Linux調優(文件系統)

查看單個文件是否發生碎片化&#xff08;被存在磁盤非連續磁盤塊上&#xff09;# filefrag -v /var/log/messages 查看文件系統是否存在大量碎片&#xff08;會顯示空閑離散的塊&#xff09;# dumpe2fs /dev/sda1 檢查文件系統中是否有錯誤產生# fsck /dev/sdb1 1、格式化相關 …

使用 nohup 設置后臺進程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 引言&#xff1a; 有時候需要在Linux上設置一個后臺進程&#xff0c;但是當你關閉terminal之時&#xff0c;它會被系統kill掉&#xff0…

CVE-2019-0708 BlueKeep的掃描和打補丁

2019獨角獸企業重金招聘Python工程師標準>>> 簡介 CVE-2019-0708 BlueKeep是一個Windows遠程桌面服務的遠程代碼執行漏洞&#xff0c;其危害程度不亞于CVE-2017-0143 EternalBlue&#xff0c;該漏洞影響了某些舊版本的Windows系統。此漏洞是預身份驗證&#xff0c;無…

《OpenCL異構計算》新版中譯本派送中!

《OpenCL異構計算1.2》新鮮出爐&#xff0c;目前市面上仍一書難求&#xff01;我們已向清華出版社訂購到第一批新書。關注異構開發社區&#xff0c;積極參與&#xff0c;就有可能免費獲取新書&#xff01; 1.如果您異構社區的老朋友&#xff0c;請關注&#xff1a;10.1假期后我…

centOS安裝Ftp

1、查看是否安裝 rpm -q vsftpd 2、安裝方法 yum install -y vsftpd 3、查看安裝位置 whereis vsftpd 4、服務管理 //服務狀態systemctl status vsftpd.service//服務啟動systemctl start vsftpd.service//服務停止systemctl stop vsftpd.service//開啟啟動systemctl enable vs…