一般在Django項目中,咱們編寫的大部分都是與Django 的模型緊密映射的表單。 舉個例子,你也許會有個Book 模型,而且你還想建立一個form表單用來添加和編輯書籍信息到這個模型中。 在這種狀況下,在form表單中定義字段將是冗餘的,由於咱們已經在模型中定義了那些字段。數據庫
基於這個緣由,Django 提供一個輔助類來讓咱們能夠從Django 的模型建立Form,這就是ModelForm。django
form與model的結合。app
from django import forms from crm import models class RegForm(forms.ModelForm): password = forms.CharField( widget=forms.PasswordInput, label='密碼', min_length=6, max_length=12 ) re_password = forms.CharField( widget=forms.PasswordInput, label='確認密碼', min_length=6, max_length=12 ) mobile = forms.CharField( ) class Meta: model = models.UserProfile # 指定model fields = '__all__' # 所有字段 # fields = ['username','password'] # 指定字段 exclude = ['is_active'] # 除某個字段以外的其他字段 labels = { 'username':'用戶名' } error_messages = { 'min_length': '過短了', } widgets = { 'username': forms.TextInput(attrs={'placeholder': '用戶名@xx.com'}), }
model = models.Book # 對應的Model中的類 fields = "__all__" # 字段,若是是__all__,就是表示列出全部的字段 exclude = None # 排除的字段 labels = None # 提示信息 help_texts = None # 幫助提示信息 widgets = None # 自定義插件 error_messages = None # 自定義錯誤信息
與普通的Form表單驗證類型相似,ModelForm表單的驗證在調用is_valid() 或訪問errors 屬性時隱式調用。spa
咱們能夠像使用Form類同樣自定義局部鉤子方法和全局鉤子方法來實現自定義的校驗規則。插件
若是咱們不重寫具體字段並設置validators屬性的化,ModelForm是按照模型中字段的validators來校驗的。code
每一個ModelForm還具備一個save()方法。 這個方法根據表單綁定的數據建立並保存數據庫對象。 ModelForm的子類能夠接受現有的模型實例做爲關鍵字參數instance;若是提供此功能,則save()將更新該實例。 若是沒有提供,save() 將建立模型的一個新實例:orm
>>> from myapp.models import Book >>> from myapp.forms import BookForm # 根據POST數據建立一個新的form對象 >>> form_obj = BookForm(request.POST) # 建立書籍對象 >>> new_ book = form_obj.save() # 基於一個書籍對象建立form對象 >>> edit_obj = Book.objects.get(id=1) # 使用POST提交的數據更新書籍對象 >>> form_obj = BookForm(request.POST, instance=edit_obj) >>> form_obj.save()