一、froms渲染錯誤資訊
url.py settings.py 略
views.py #視圖函式
from django.shortcuts import render,redirect,HttpResponse from app01 import myforms def register(request): if request.method=='GET': form=myforms.MyForm() return render(request, 'register.html',{'form':form}) else: form=myforms.MyForm(request.POST) if form.is_valid(): # 存資料庫 print('-----',form.cleaned_data) return redirect('http://www.baidu.com') else: err=form.errors.get('__all__') print(form.errors.get('__all__')) #{name:[],age:[],__all__:[]} return render(request, 'register.html',{'form':form,'err':err})
myforms.py
需要儲備的知識:
forms組件引數配置
# 定制模板中的顯示樣式,及配置類 # widget=widgets.PasswordInput(attrs={'class': 'form-control'}) # 錯誤資訊中文顯示 error_messages={'min_length': '太短了小伙子'}
class MyForm(forms.Form): # 校驗這個欄位,最大長度是32,最小長度是3 name = forms.CharField(required=False, max_length=32, min_length=3, label='用戶名', widget=widgets.TextInput(attrs={'class': 'form-control'}), error_messages={'min_length': '太短了小伙子'}) password = forms.CharField(required=False, max_length=32, min_length=3, label='密碼', widget=widgets.PasswordInput(attrs={'class': 'form-control'}), error_messages={'min_length': '太短了小伙子'}) re_password = forms.CharField(required=False, max_length=32, min_length=3, label='確認密碼', widget=widgets.PasswordInput(attrs={'class': 'form-control'}), error_messages={'min_length': '太短了小伙子'}) email = forms.EmailField(label='郵箱', error_messages={'required': '小伙子,這個必填'}, widget=widgets.TextInput(attrs={'class': 'form-control'})) age = forms.IntegerField(max_value=https://www.cnblogs.com/guojieying/archive/2020/10/20/200, min_value=0, label='年齡', widget=widgets.TextInput(attrs={'class': 'form-control'})) text = forms.CharField(label='個人簡介', widget=widgets.Textarea(attrs={'class': 'form-control'})) date = forms.CharField(label='出生日期', widget=widgets.DateInput(attrs={'class': 'form-control'}))
代碼:
from django import forms from django.forms import widgetsclass MyForm(forms.Form): # 校驗這個欄位,最大長度是32,最小長度是3 name = forms.CharField(required=False, max_length=32, min_length=3, label='用戶名', widget=widgets.TextInput(attrs={'class': 'form-control'}), error_messages={'min_length': '太短了小伙子'}) password = forms.CharField(required=False, max_length=32, min_length=3, label='密碼', widget=widgets.PasswordInput(attrs={'class': 'form-control'}), error_messages={'min_length': '太短了小伙子'}) re_password = forms.CharField(required=False, max_length=32, min_length=3, label='確認密碼', widget=widgets.PasswordInput(attrs={'class': 'form-control'}), error_messages={'min_length': '太短了小伙子'}) email = forms.EmailField(label='郵箱', error_messages={'required': '小伙子,這個必填'}, widget=widgets.TextInput(attrs={'class': 'form-control'})) age = forms.IntegerField(max_value=https://www.cnblogs.com/guojieying/archive/2020/10/20/200, min_value=0, label='年齡', widget=widgets.TextInput(attrs={'class': 'form-control'}),error_messages={'max_value': '輸入數字過大','min_value': '輸入數字太小'}) text = forms.CharField(label='個人簡介', widget=widgets.Textarea(attrs={'class': 'form-control'})) date = forms.CharField(label='出生日期', widget=widgets.DateInput(attrs={'class': 'form-control'}))
register.html #模板檔案
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href=https://www.cnblogs.com/guojieying/archive/2020/10/20/"/static/bootstrap/css/bootstrap.min.css"> <title>Document</title> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <h1>模板渲染</h1> <form action="" method="post" novalidate> {# novalidate表示前端不校驗了#} {% for foo in form %} <div class="form-group"> <label for="">{{ foo.label }}</label> {{ foo }} <span class="text-danger pull-right">{{ foo.errors }}</span> {# pull-right表示靠右#} </div> {% endfor %} <div class="text-center"> <input type="submit" value=https://www.cnblogs.com/guojieying/archive/2020/10/20/"提交" class="btn btn-danger"> <span class="text-primary">{{ err }}</span> </div> </form> </div> </div> </div> </body> </html>
二、區域鉤子
更復雜的校驗,姓名不能以sb開頭
區域鉤子(寫一個方法,方法名叫 clean_欄位名)
一旦能走到這個方法中,說明前面的校驗已經通過了
#使用步驟 # 1 在自定義的Form類中寫 clean_欄位名 # 2 取出欄位的真正值,name=self.cleaned_data.get('name') # 3 判斷自己的規則,如果判斷失敗,拋出ValidationError # 4 如果通過,return name def clean_name(self): # name對應的值,如何取到? name = self.cleaned_data.get('name') if name.startswith('sb'): # 不讓校驗通過 raise ValidationError('不能以sb開頭') else: # 校驗通過,回傳name return name
三、全域鉤子
校驗兩次密碼是否相同
## 全域鉤子函式 # 只要走到它,前面,欄位自己的校驗和區域鉤子校驗都通過了 def clean(self): # name=self.cleaned_data.get('name') # print(name) password = self.cleaned_data.get('password') re_password = self.cleaned_data.get('re_password') if password == re_password: return self.cleaned_data # return {'lqz':"nb"} else: raise ValidationError('兩次密碼不一致')
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/184559.html
標籤:其他
上一篇:2020-10-20
