一般在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()