Django之ModelForm组件
ModelForm的定义
通常在Django项目中,我们会编写的大部分都是与Django 相关的各种各样的表单,在这种情况下,在form表单中定义字段将是冗余的,因为我们已经在app文件夹下的models.py文件中定义了那些字段。
基于这个原因,Django 提供一个让我们更加方便快捷的组件,这就是ModelForm,ModelForm是form与model的终极结合,会根据你model中的字段转换成对应的form字段,并且生成标签等操作。
ModelForm类的写法
from django.forms import ModelForm
from app01 import models as m
class BookForm(ModelForm):
class Meta:
model=m.Books #对应model中的类
fields="__all__"
label={'name':'书名','price':'价格','publish':'出版社'}
error_messages={'name':{'required':'名字不能为空'},'price':{'required':'价格不能为空'}}
Meta下常用参数:
model = m.Book # 对应的Model中的类
fields = "__all__" # 如果是__all__,就是表示列出所有的字段
exclude = ['name', ] # 排除name字段,值为一个列表可填多个
labels = {'name':'书名',} # 提示信息,值为一个字典
help_texts = None # 自定义帮助提示信息
widgets={'password':w.PasswordInput(attrs={'class':'c1'})} # 自定义插件
error_messages={'name':{'required':'名字不能为空'},'price':{'required':'价格不能为空'}} #自定义错误信息
自定义钩子
from django.core.exceptions import ValidationError
class BookForm(ModelForm):
class Meta:
model=m.Books #对应model中的类
fields="__all__"
label={'name':'书名','price':'价格','publish':'出版社'}
error_messages={'name':{'required':'名字不能为空'},'price':{'required':'价格不能为空'}}
def clean_name(self): #局部钩子,和form相似
if 验证条件通过:
return slef.clean_data
else:
raise ValidationError('错误信息')
def clean(self): #全局钩子
if 验证条件通过:
return slef.clean_data
else:
raise ValidationError('错误信息')
save()方法
def xo(request):
if request.method=="GET":
m=BookForm()
return render(request,'model.html',{'m':m})
elif request.method=="POST":
m=BookForm(request.POST)
if m.is_valid():
m.save() #保存单表信息
return render(request,'model.html',{'m':m}
#########################################
# 默认保存多对多
obj = form.save(commit=True)
# 不做任何操作,内部定义 save_m2m(用于保存多对多)
obj = form.save(commit=False)
obj.save() # 保存单表信息
obj.save_m2m() # 保存关联多对多信息
编辑数据
obj=model.Book.object.get(id=1)
model_form=BookForm(instance=obj)