python測試開發django-114.ModelForm中局部鉤子(clean_)和全局鉤子校驗

2022-01-25 從零開始學自動化測試

收錄於話題 #django 107個

前言

在實際開發中,不僅僅是對輸入框字符的格式校驗,比如註冊功能,註冊帳號還得校驗資料庫是否已經有帳號被註冊過了。
有些場景不僅僅是對單個輸入框的字符校驗,比如修改密碼的時候,會涉及2個輸入框的數據格式校驗,像這些複雜的場景校驗需用到校驗鉤子來實現。
校驗form表單數據合法性,is_valid()方法調用順序:

1.欄位規則校驗,字符長度,是否必填等基本校驗

2.validators校驗(RegexValidator校驗器或自定義校驗函數)

3.局部鉤子(類中定義的以clean_欄位名命名的函數,校驗正常必須返回該欄位的值self.cleaned_data.get(『name』))

4.全局鉤子(類中定義的函數名clean,校驗正常必須返回該對象的校驗結果值return self.cleaned_data)

5.每一步通過校驗單結果都以字典形式保存在類對象的cleaned_data屬性中

ModelForm模型表單

局部鉤子命名規則為clean欄位名稱,如:cleancity,clean_years。
super() 重寫`__init`,可以批量更新class屬性。

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class SubmitPageForm(forms.ModelForm):

class Meta:
model = Submit
# fields = "__all__" #全部欄位
fields = ["city", "years", "details"]
widgets = {
"city": widgets.TextInput(attrs={
"placeholder": "輸入城市:北京/上海/深圳"
}),
"years": widgets.TextInput(attrs={
"placeholder": "輸入年限"}),
"details": widgets.TextInput(attrs={
"placeholder": "輸入詳情"}),

}
labels = {
"city": "城 市",
"years": "年 限",
"details": "詳 情",
}

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 批量更新class屬性
for field in self.fields.values():
field.widget.attrs.update({'class': 'form-control'})

def clean_city(self):
"""局部鉤子判斷城市必須是北京/上海/深圳其中一個"""
city_val = self.cleaned_data.get('city', '')
if city_val in ["北京", "上海", "深圳"]:
return city_val
else:
raise forms.ValidationError('城市只能選:北京/上海/深圳')

定義視圖

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class SubmitView(View):

def get(self, request):
form_obj = SubmitPageForm
return render(request, "submit.html", locals())

def post(self, request):
form_obj = SubmitPageForm(request.POST)
if form_obj.is_valid():
# data = form_obj.cleaned_data()
form_obj.save()
msg = "保存成功"
return HttpResponseRedirect('/total')

else:
# 全局鉤子自定義錯誤提示獲取
# print(form_obj.errors.get('__all__'))
# error_msg = form_obj.errors.get('__all__')
return render(request, "submit.html", locals())

模板內容

模板內容如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>提交頁面</title>
<meta charset="utf-8">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

<div>

<form role="form" action="" method="POST" id="detail-form" >
{% csrf_token %}
{% for field in form_obj %}
<div>
{{ field.label_tag }}
{{ field }}
<div style="color: red"> {{ field.errors }} </div>

</div>

{% endfor %}
<p>
<input type="submit" value="提交" >
</p>
</form>
</div>
</body>
</html>

頁面效果

輸入不合法的內容,會顯示field.errors內容

全局鉤子

針對單個欄位校驗可以用局部鉤子實現,如果我們要校驗多個欄位,比如校驗註冊的時候輸入2次密碼一致,可以用全局鉤子實現。
定義全局鉤子使用clean方法

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class SubmitPageForm(forms.ModelForm):

class Meta:
model = Salary
fields = "__all__" #全部欄位
# 省略中間代碼。。。。。# 全局鉤子
def clean(self):
"""在通過基礎驗證的乾淨數據中get獲取欄位"""
pwd1 = self.cleaned_data.get('password')
pwd2 = self.cleaned_data.get('password2')
if pwd1 and pwd2: # 這裡判斷2個欄位都是校驗通過
if pwd1 == pwd2:
# 數據沒問題,那麼原封不動返回即可
return self.cleaned_data
else:
# 錯誤信息儲存到 errors {'__all__':[e,]}
raise ValidationError('兩次密碼輸入不同')
else:
return self.cleaned_data

前端可以通過fomr_obj.errors.__all__獲取到內置校驗器的全部錯誤信息

2021年第八期《python接口web自動化+測試開發》7.17號開學(課程全面升級!) 加量不加價(新增postman, 贈送selenium和python基礎2個課)

本期上課時間:7月17號-10月16號,每周六、周日晚上20:30-22:30

聯繫微信/QQ:283340479

相關焦點

  • python測試開發django -142.Bootstrap 表單(form)
    ="Email"> </div> <div> <label for="Password1">密碼</label> <input type="password" id="Password1" placeholder="Password
  • 深入理解Django的Form表單
    Form表單的作用;1.2、forms欄位和插件在上述實例中,使用Form需要創建一個Form相關的類,並且在類中寫入相關的forms欄位,這裡涉及到Field類,是所有forms欄位最根本的基類,它位於django.forms.Field下;創建Form類時,主要涉及到 【欄位】 和 【插件】,欄位用於對用戶請求數據的驗證,插件用於自動生成HTML;1.2.1、欄位的基本參數在這個類中的
  • 5 分鐘掌握 Python 中的 Hook 鉤子函數
    hook函數的作用舉個例子,hook的概念在windows桌面軟體開發很常見,特別是各種事件觸發的機制; 比如C++的MFC程序中,要監聽滑鼠左鍵按下的時間,MFC提供了一個onLeftKeyDown的鉤子函數。
  • python測試開發django-1.開始hello world!
    前言當你想走上測試開發之路,用python開發出一個web頁面的時候,需要找一個支持python語言的web框架。
  • Flask框架鉤子函數使用方式及應用場景分析
    鉤子函數就是等同於高速公路上的收費站,進高速之前給你一個卡,並檢查你是否超重。離開之前收你,也可以攔住你安檢一下。一、基礎概念:request: Flask的請求上下文,包含請求變量如:method、args、form、values、endpoint、headers、remote_addr都是比較常用的。session:Flask的請求上下文,用於存放用戶的會話信息。
  • 使用 Django 進行測試驅動開發
    基於以下幾點原因:TDD 可以被認為是根據測試用例來說明需求。此後編寫原始碼,重點是滿足這些要求。當測試最終通過時,你可以確信已滿足要求。這種專注可以幫助開發人員避免範圍蔓延。TDD 可以通過較短的開發周期提高開發效率。一次解決測試用例中的個別可以最大限度地減少幹擾因素。重大更改將更容易跟蹤和解決。減少了調試工作,提高了效率,並且將更多時間花在開發上。編寫測試時考慮到了需求。
  • Vue框架之生命周期鉤子
    例子中helloVue是方法名,其中function可以省略,直接寫一個helloVue方法。2生命周期鉤子鉤子,就可以將其理解成回調函數,Vue為生命周期中的每個狀態都設置了鉤子函數。例如在回顧中的v-model,代表了就是view和model的雙向綁定。那差值閃爍的問題怎麼解決呢?
  • Django Form基於Model定義表單
    在本章中我們講解最後一個知識點,即基於 Model 模型類定義數據表,這種業務場景也是我們在實際的開發工作中經常遇到的,比如我們要添加一本書籍,
  • 8個能提高Django開發效率的Python包
    不再需要從幾個不同的應用程式中導入數據,來測試一個複雜的關係! clean_pyc命令會將項目目錄中所有位置的.pyc項目刪除。 create_template_tags用於在您指定的應用程式中創建一個模板標籤目錄結構。 describe_form將顯示模型的表單定義,然後您可以將其複製/粘貼到forms.py中。
  • python測試開發django-130.jQuery中$.ajax()方法發GET/POST/DELETE請求
    前言jQuery中$.ajax()方法可以發 GET/POST/DELETE 請求等 HTTP 的請求方式。
  • Django中的單元測試怎麼寫?
    在 Django 框架中,當新建一個應用時,會默認新建一個用於單元測試的 test.py 文件,我們的單元測試代碼就寫在 test.py 裡。1、一個簡單的測試案例在建立user應用,user應用中書寫一個測試案例:from django.test import TestCasedef add(a,b): return a + bif __name
  • Django Form表單完整使用流程
    ,我們可以嘗試使用表單系統來實現這個功能了,在本節我們將匯總相關知識點,以此來講解如何使用 Form 表單系統完成實際功能的開發。表單系統重點知識回顧表單系統的核心是 Form 對象,它將表單中的欄位封裝成了一系列的 Field 和驗證規則,以此來自動生成 HTML 表達標籤。本節中首先使用 Form 對象實現書籍的搜索功能,然後再詳細講解 Form 對象的構成。那麼下面我們首先對前面學過的知識做一下簡單的重點知識回顧。
  • Django ModelForm用法詳解
    常用的Meta選項在上節一中,我們 class Meta 中使用了一些元數據項,比如說 exclude、labels 以及 fields,當然還有些其他的選項,在 Django 官方網站 ModelForm 的定義如下所示modelform_factory(model,form = ModelForm,fields = None,exclude
  • Python + Django 開發實戰(下)
    接下來談談日誌記錄,單元測試和程序調優和重構等內容。    這一篇要談的內容,也是開發中不可忽視的環節。 開發中日誌記錄能幫我們記錄信息定位問題;單元測試幫助我們在迭代開發過程及時發現問題,減少bug的引入; 而程序調優與重構,是一個永恆的話題。 日誌的重要性想必不用多說。 在我看來,日誌的作用主要有兩點:運營數據支撐。
  • python測試開發django-76.ORM查詢之Q查詢
    查詢 or如有個 Card 模型,表裡面有以下數據查詢 card_user 名稱為 YOYO 或 yoyo的數據,使用 SQL 可以這樣查詢select * from yoyo_card where card_user = 'YOYO' or 'yoyo';filter() 查詢,查詢或關係MyDjango>python
  • python測試開發django-117.bootstrapTable結合Paginator分頁器查顯示表格
    " src="/static/bootstarp/jquery/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="/static/bootstarp/js/bootstrap.min.js"></script> <script type="text/javascript
  • 利用鍵盤鉤子捕獲Windows鍵盤動作
    這種技術便是本文將要論述的核心--系統全局鉤子。本文下面將對Win32平臺下全局鉤子的運行機制進行介紹並給出了一個具體的由VC++6.0編寫的捕獲鍵盤動作的鍵盤鉤子示例程序。   系統鉤子和DLL  鉤子的本質是一段用以處理系統消息的程序,通過系統調用,將其掛入系統。
  • 程式設計師們之間常說的鉤子「hook」是啥意思?
    程式設計師尤其 Windows 程式設計師會經常說「下個鉤子」,小編還是一名學生的時候,對說出這個短語的人真是崇拜至極。這麼多年過去了,小編還會不經意間蹦出這幾個字,即使已經了解這是一名程式設計師的基本功,說起來依然覺得有範兒。
  • 程式設計師常說的鉤子(Hook)是啥意思?
    其實鉤子來源於英文詞Hook,在windows系統中,一切皆消息,比如按了一下鍵盤,也是一個消息,Hook的意思是勾住,也就是在消息過去之前,可以先把消息勾住,不讓其傳遞,你可以優先處理,也即這項技術就是提供了一個入口,能夠針對不同的消息或者API在執行前,先執行你的操作,你的操作也稱為「鉤子函數」。
  • Django實戰教程: 開發企業級應用智能文檔管理系統smartdoc(1)
    學好Django不僅可以開發中大型網站, 還可以開發專業的企業級 網絡應用(Web App)。