Django基礎011-form&modelform
阿新 • • 發佈:2020-09-04
1、form
from django import forms from django.core.exceptions import ValidationError #出現異常時用的 from user import models #validators的先驗證 #第一步驗證 def test_phone(value): print('test_phone',3) if len(value) != 11: raise ValidationError('手機號碼格式不正確')#丟擲異常 else: return value classArticleForm(forms.Form): #欄位名稱要和提交的欄位相同 title = forms.CharField(required=True,#是否必填 validators=[test_phone],#自定義校驗,公共校驗,驗證手機,郵箱 strip=False,#是否去掉輸入的空格,預設為True error_messages={#錯誤資訊提示 'required':'必填引數未填', 'max_length':'最大10個字元', 'min_length':'最小5個字元' }) # 欄位名稱要和提交的欄位相同 # title = forms.CharField(required=True, # 是否必填 # max_length=10, # 最大字元長度 # min_length=5, # 最小字元長度# strip=False, # 是否去掉輸入的空格,預設為True # error_messages={ # 錯誤資訊提示 # 'required': '必填引數未填', # 'max_length': '最大10個字元', # 'min_length': '最小5個字元' # }) #form 中的鉤子函式 #第三步對全域性進行驗證 def clean(self): print('clean',1) # 通過 self.cleaned_data獲取所有的資料 return self.cleaned_data #針對個別欄位進行驗證 #第二步對個別資料進行驗證 def clean_title(self): print('clean_title',2) #驗證手機號是否是我們系統的 return self.cleaned_data.get('title') def clean_content(self): pass
views.py中的程式碼塊
from user.forms import ArticleForm,StudentForm def add_article(request): if request.method == 'GET': return render(request,'post.html') else: article_obj = ArticleForm(request.POST) f = article_obj.is_valid()#獲取校驗結果 if f: cleaned_data = article_obj.cleaned_data#校驗通過後,結果會存在cleaned_data中,是個dict print(cleaned_data) else: print(article_obj.errors) return HttpResponseRedirect(article_obj.errors)
2、modelform
# model + form def test_name(value): if value == 'dsx': raise ValidationError('姓名不存在。') else: return value class StudentForm(forms.ModelForm): # 當你覺得model寫的驗證規則不符合你的要求,可以像forms.Form 一樣進行驗證 name = forms.CharField(validators=[test_name]) class Meta: model = models.Student # 建立類變數和model建立對映關係 # fields = '__all__' # 驗證全部欄位 # fields = ['name'] # 顯示指定列驗證 只有指定的驗證的欄位才會出現在cleaned_data中 exclude = ['age'] # 排除了就不會出現在cleaned_data中 def clean(self): if self.cleaned_data.get('name') == 'ssz': raise ValidationError('姓名是射手座') else: return self.cleaned_data # 單個欄位驗證,必須要爭在form中有些這個 欄位 def clean_name(self): if self.cleaned_data.get('name') == 'nhy': raise ValidationError('姓名是nhy') else: return self.cleaned_data.get('name')
views.py中的程式碼塊
def student(request): if request.method == 'GET': return render(request,'student.html') else: studentObj = StudentForm(request.POST) f = studentObj.is_valid() if f: print('cleaned_data',studentObj.cleaned_data) else: print('errormsg',studentObj.errors) return HttpResponse('ok')