日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django12:form 组件/渲染标签/数据校验/钩子函数/

發(fā)布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django12:form 组件/渲染标签/数据校验/钩子函数/ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基本用法

from django import forms# 自己寫一個類 class RegForm(forms.Form):username= forms.CharField(min_length=3,max_length=8, label="用戶名")password = forms.CharField(min_length=3,max_length=8,label="密碼")email=forms.EmailField()

?

1.校驗數(shù)據(jù)為字典形式。

2.is_valid():全部數(shù)據(jù)通過才true;

3. cleaned_data:查看符合校驗的數(shù)據(jù)

4.errors:查看不符合校驗的數(shù)據(jù),以及不符合原因。

5.多傳字段直接忽略。

6.少傳錯誤,默認(rèn)所有字段必須傳值。

?

渲染標(biāo)簽

forms組件只幫你渲染獲取用戶輸入(輸入 選擇 下拉 文件)的標(biāo)簽 不渲染按鈕和form表單標(biāo)簽
渲染出來的每一個input提示信息都是類中字段首字母大寫

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

第一種

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

第二種

<p>第二種渲染方式: 擴(kuò)展性較高 書寫較為繁瑣</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)方式。也可以用ajax

{{ form.errors.0 }} # 這個是模板語法

<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ù)校驗

數(shù)據(jù)校驗一個前后端都得有 但是前端的校驗弱不禁風(fēng) 可有可無
而后端的校驗則必須非常全面

form表單取消前端瀏覽器自動校驗功能 <form action="" method="post" novalidate>

notes:

1.必備條件,get請求和post傳給html頁面對象變量名必須一致。(form_obj)

2,當(dāng)不合法的時候,也會保存上次數(shù)據(jù),方便修改。

?

CharField用戶名類型校驗

from django.forms import widgets //不導(dǎo)入也可以,沒提示class MyRegForm(forms.Form):# 用戶名最少3位最多8位username = forms.CharField(max_length=8,min_length=3,label='用戶名',error_messages={ //報錯信息的提示'max_length':"用戶名最長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屬性)email = forms.EmailField(label='郵箱',error_messages={'required':'郵箱必填','invalid':'郵箱格式不正確'})

?

鉤子函數(shù)


局部鉤子:操作單個字段的數(shù)據(jù)

全局鉤子:操作多個字段的數(shù)據(jù)

鉤子勾回來處理完之后,還要還回去的

?

局部鉤子

校驗用戶名中不能包含666

# 局部鉤子 # 這里的self是自己類,MyRegFormdef clean_username(self):username = self.cleaned_data.get('username')if '666' in username:self.add_error('username','光喊666是不行的') //添加報錯信息return username //再把數(shù)據(jù)返回去

全局鉤子

前面驗證通過才走鉤子函數(shù)驗證。一層一層的驗證

兩次密碼驗證-----兩個字段

class MyRegForm(forms.Form):# 密碼password = forms.CharField(max_length=8,min_length=3,label='密碼',widget=forms.widgets.PasswordInput(attrs={'class':'form-control'}))# 密碼驗證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# 校驗密碼和確認(rèn)密碼是否一致password = self.cleaned_data.get('password')re_password = self.cleaned_data.get('re_password')if not password == re_password:# 展示提示信息self.add_error('re_password','兩次密碼不一致') // 添加報錯信息return self.cleaned_data

?

form組件其他參數(shù)及補(bǔ)充知識點(diǎn)

max_length //允許輸入的最大長度 min_length //最小長度label input的提示信息,name、password等error_messages 自定義報錯的提示信息'max_length':"用戶名最長8位",'min_length':"用戶名最短3位",'required':"用戶名不能為空"required 設(shè)置字段是否允許為空 initial 設(shè)置默認(rèn)值widget 控制type類型及屬性 type classs#多個屬性用空格widget=forms.widgets.TextInput(attrs={'class': 'form-control c1 c2'})widget=forms.widgets.PasswordInput()###正則校驗及報錯信息,并且支持多個validator phone = forms.CharField(validators=[RegexValidator(r'^[0-9]+$', '請輸入數(shù)字'), RegexValidator(r'^159[0-9]+$', '數(shù)字必須以159開頭')])

?

其他字段屬性

性別校驗

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

?

愛好單選 select校驗

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

愛好多選select 校驗1

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

愛好多選chekbox校驗2

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

是否記住密碼校驗

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

?

?

?

詳細(xì)請參考:https://www.cnblogs.com/guyouyin123/p/12189453.html

?

總結(jié)

以上是生活随笔為你收集整理的django12:form 组件/渲染标签/数据校验/钩子函数/的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。