1. 程式人生 > 實用技巧 >Django基礎011-form&modelform

Django基礎011-form&modelform

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


class
ArticleForm(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')