markdownpad2 html渲染组件出错_Day68 Django forms组件
目錄
- forms組件
- forms組件類書寫
- forms組件如何校驗數據
- forms組件如何渲染標簽
- forms組件展示錯誤信息
- forms組件鉤子函數(HOOK)
- forms組件常見參數
- forms組件源碼
1、forms組件
小示例:
寫一個注冊功能:
利用form表單提交數據,獲取用戶名密碼,在后端判斷用戶名密碼是否符合條件:用戶名不能包含abc字符串,密碼不能少于6位數。
views.py文件:
from django.shortcuts import render# Create your views here. def ab_form(request):back_dic = {'username':'','password':''}if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if 'abc' in username:back_dic['username'] = '用戶名不能包含字符串abc'if len(password)<6:back_dic['password'] = '密碼必須為6位數'# back_dic字典值默認是空,當用戶輸入用戶名密碼并提交時,就發起了post請求,back_dic通過校驗如果不符合要求就會傳值return render(request,'ab_form.html',locals())html頁面:
<body> <form action="" method="post"><p>username:<input type="text" name="username"><span style="color: red">{{ back_dic.username }}</span></p><p>password:<input type="password" name="password"><span style="color: red">{{ back_dic.password }}</span></p><input type="submit" class="btn btn-info" value="submit"> </form> </body>以上我們就手動完成了需求:
1、書寫前端獲取用戶數據的HTML代碼
2、后端對用戶數據進行校驗
3、對不符合要求的數據進行前端提示
實際上以上功能form組件都能完成(渲染代碼、校驗數據、前端展示提示)。
應用場景:例如博客園的注冊頁面
數據校驗前端可有可無,但是后端必須要有!因為前端的校驗你可以直接修改,或者利用爬蟲程序繞過前端頁面直接朝后端提交數據。
2、forms組件類書寫
views.py文件中:
from django import forms class MyForm(forms.Form):# username,password這兩個字段最少3位數,最大8位數username = forms.CharField(min_length=3,max_length=8)password = forms.CharField(min_length=3,max_length=8)# email字段必須符合郵箱格式,xx@xx.comemail = forms.EmailField()3、forms組件如何校驗數據
測試環境的準備除了我們之前用的tests.py,在pycharm里面已經給我們提供了一個Django的測試環境:點擊Python Console:
校驗步驟:
1、將要校驗的數據組織成形式傳入
2、判斷數據是否合法,is_valid()方法用來校驗我們傳入的字典數據是否合法,該方法只有在所有的數據全部合法的情況下才會返回True
3、cleaned_data拿到所有符合條件的數據;
4、errors拿到所有不符合校驗規則的數據以及不符合規則的原因,以鍵值對的形式展現,并且值是以列表的形式,因為一個字段有可能會不符合多個規則。
如果我再多傳入一個hobby鍵:
form_obj = views.MyForm({'username':'jack','password':'12','email':'123','hobby':'study'})那么hobby是不會被校驗的,只會找MyForm類里面書寫的字段去做校驗,而hobby不會被放到cleaned_data也不會被放到errors中。
默認情況下,類里面的所有字段都必須傳值。如果少傳了一個鍵,少傳的那個字段會被放到errors中:
form_obj = views.MyForm({'username':'jack','password':'123'})
form_obj.errors
{'email': ['This field is required.']}
form_obj.cleaned_data
{'username': 'jack', 'password': '123'}
4、forms組件如何渲染標簽
結合form組件獲取用戶注冊的用戶名密碼郵箱,有了form組件之后所有獲取用戶輸入的標簽都不需要自己寫了。form組件不會幫你渲染提交按鈕,要自己添加。
views.py文件:
from django import forms class MyForm(forms.Form):# username,password這兩個字段最少3位數,最大8位數username = forms.CharField(min_length=3,max_length=8,label='用戶名')password = forms.CharField(min_length=3,max_length=8,label='密碼')# email字段必須符合郵箱格式,xx@xx.comemail = forms.EmailField(label='郵箱')def index(request):# 1、先產生一個空對象form_obj = MyForm()# 2、直接將該空對象傳遞給HTML頁面return render(request,'index.html',locals())前端index.html頁面(前端對生成的空對象做操作):
label屬性默認展示的是類中字段首字母大寫的形式,也可以修改:通過給字段加label屬性。
5、forms組件展示錯誤信息
瀏覽器會自動幫你做校驗(如下圖的提示信息),但是前端的校驗還是不安全,我們可以給form表單加個參數取消前端瀏覽器自動校驗功能:<form action="" method="post" novalidate>
form表單展示錯誤信息需要注意:
1、get請求和post請求傳給頁面的對象變量名必須一致form_obj
2、當你的數據不合法時,form組件會保存你輸入的數據,讓你基于上次的輸入數據進行修改,更加人性化
views.py文件
from django import forms class MyForm(forms.Form):# username,password這兩個字段最少3位數,最大8位數username = forms.CharField(min_length=3,max_length=8,label='用戶名',error_messages={'min_length':'用戶名最少3位','max_length':'用戶名最多8位','required':'用戶名不能為空'})password = forms.CharField(min_length=3,max_length=8,label='密碼',error_messages={'min_length': '密碼最少3位','max_length': '密碼最多8位','required': '密碼不能為空'})# email字段必須符合郵箱格式,xx@xx.comemail = forms.EmailField(label='郵箱',error_messages={'invalid':'郵箱格式不正確','required': '郵箱不能為空'})def index(request):# 1、先產生一個空對象form_obj = MyForm()if request.method == 'POST':# 3、校驗數據form_obj = MyForm(request.POST)# 4、判斷數據是否合法if form_obj.is_valid():# 5、如果合法,操作數據庫存儲數據return HttpResponse('OK')# 5、如果不合法,將錯誤信息展示到前端# 2、直接將該空對象傳遞給HTML頁面return render(request,'index.html',locals())index.html頁面:
<body> <form action="" method="post" novalidate>{% for form in form_obj %}<p> {{ form.label }} :{{ form }} {# form.errors.0這后面加了一個.0表示只拿列表第一個錯誤信息,就不會自動幫你生成ul標簽 #}<span style="color:red">{{ form.errors.0 }}</span></p>{% endfor %}<button>提交</button> </form> </body>在給字段添加了error_messages參數之后,錯誤提示就變成自己輸入的了(自定義)。
6、forms組件鉤子函數
鉤子函數:在特定的節點自動觸發完成響應操作
在form組件中有兩類鉤子
1、局部鉤子
當你需要給某個字段增加校驗規則的時候可以使用,在后端校驗的基礎上進行二次校驗。
2、全局鉤子
當你需要給多個字段增加校驗規則的時候可以使用。
實際案例:
1、校驗用戶名中不能包含666(只需要校驗用戶名,可以用局部鉤子)
2、校驗密碼和確認密碼是否一致(校驗密碼字段和確認密碼字段,需要用全部鉤子)
views.py文件做如下修改:
from django import forms class MyForm(forms.Form):# username,password這兩個字段最少3位數,最大8位數username = forms.CharField(min_length=3,max_length=8,label='用戶名',error_messages={'min_length':'用戶名最少3位','max_length':'用戶名最多8位','required':'用戶名不能為空'})password = forms.CharField(min_length=3,max_length=8,label='密碼',error_messages={'min_length': '密碼最少3位','max_length': '密碼最多8位','required': '密碼不能為空'})confirm_password = forms.CharField(min_length=3,max_length=8,label='確認密碼',error_messages={'min_length': '密碼最少3位','max_length': '密碼最多8位','required': '密碼不能為空'})# email字段必須符合郵箱格式,xx@xx.comemail = forms.EmailField(label='郵箱',error_messages={'invalid':'郵箱格式不正確','required': '郵箱不能為空'})# 局部鉤子def clean_username(self):# 獲取用戶名username = self.cleaned_data.get('username')if '666' in username:# 提示前端展示錯誤信息# 提示方式1:self.add_error('username','用戶名不能包含666')# 提示方式2(繁瑣,一般不用):# raise ValidationError('用戶名不能包含666.')# 將鉤子函數鉤取出來的數據再放回去return username# 全局鉤子def clean(self):# 獲取兩個密碼字段password = self.cleaned_data.get('password')confirm_password = self.cleaned_data.get('confirm_password')if not confirm_password == password:self.add_error('confirm_password','兩次密碼不一致')# 校驗后將全局鉤子鉤出來的數據再放回去return self.cleaned_data7、forms組件常見參數
label='用戶名',設置字段名
error_messages={'min_length': '密碼最少3位',},自定義報錯信息
initial='jack',默認值
required=False,設置成必填字段
widget=forms.widgets.PasswordInput(attrs={'class':'form-control c1 c2'}),調整樣式(多個屬性值用空格隔開即可)
from django.core.validators import RegexValidator
class MyForm(Form):
user = fields.CharField(validators=[RegexValidator(r'^[0-9]+$', '請輸入數字'), RegexValidator(r'^159[0-9]+$', '數字必須以159開頭')],
),支持字段寫正則表達式,可以寫多個正則一一匹配
radiocheckboxselectDjango Form表單組件 - JasonJi - 博客園?www.cnblogs.comclass LoginForm(forms.Form):...hobby = forms.MultipleChoiceField(choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),label="愛好",initial=[1, 3],widget=forms.widgets.CheckboxSelectMultiple()) keep = forms.ChoiceField(label="是否記住密碼",initial="checked",widget=forms.widgets.CheckboxInput()) hobby = forms.MultipleChoiceField(choices=((1, "籃球"), (2, "足球"), (3, "雙色球"), ),label="愛好",initial=[1, 3],widget=forms.widgets.SelectMultiple())
針對字段的校驗方式:
1、最簡單的max_length,min_length
2、正則validator
3、鉤子函數
8、forms組件源碼
切入點:form_obj.is_valid()
def is_valid(self):"""Returns True if the form has no errors. Otherwise, False. If errors arebeing ignored, returns False."""return self.is_bound and not self.errors # 如果is_valid要返回true的話,那么self.is_bound要為true,self.errors要為false # self.is_bound = data is not None or files is not None # 所以只要你傳數據了,那么self.is_bound就是true@propertydef errors(self):"Returns an ErrorDict for the data provided for the form"if self._errors is None:self.full_clean()return self._errors# forms組件所有功能基本都出自于該方法:def full_clean(self):self._clean_fields() # 校驗字段+局部鉤子self._clean_form() # 全局鉤子self._post_clean()forms組件源碼?www.bilibili.com總結
以上是生活随笔為你收集整理的markdownpad2 html渲染组件出错_Day68 Django forms组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 到网站进过的服务器 命令,进入服务器的命
- 下一篇: java query接口_「软帝学院」J