Django 之 ModelForm组件
Django内部封装的 ModelForm组件,是Django 框架里 model与form组件的结合体,拥有models和Form的所有功能。ModelForm组件与Form组件继承的是同一个类。
引用方法:
from django.forms import ModelForm
基本语法:
from django.forms import ModelForm from django.forms import fields from django.forms import widgets class TestForm(ModelForm): 字段 = fields.CharField() #覆盖 class Meta: 该类下的主要方法,请看下面详解 #也可以自定义字段的验证规则 def clean_字段名(self): pass
参数及应用详解:
ModelForm
a. class Meta:
model, # 对应Model的数据,注意只能是一张表,多了不行!表内有Fk or M2M .. 可以进行连表操作
fields=None, # 字段 '__all__' 代表所有字段
exclude=None, # 排除字段 不显示某个或是多个字段 []
labels=None, # 提示信息 {}
help_texts=None, # 帮助提示信息 {}
widgets=None, # 自定义插件 {}
error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
field_classes=None # 自定义字段类 (也可以自定义字段) {}
localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
如:
数据库中
2016-12-27 04:10:57
setting中的配置
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
则显示:
2016-12-27 12:10:57
b. 验证执行过程
is_valid -> full_clean -> 钩子 -> 整体错误
c. 字典字段验证
def clean_字段名(self):
# 可以抛出异常
# from django.core.exceptions import ValidationError
return "新值"
d. 用于验证
model_form_obj = XXOOModelForm() #实例化对象
model_form_obj.is_valid() #验证
model_form_obj.errors.as_json() #错误信息
model_form_obj.clean()
model_form_obj.cleaned_data #验证之后的值
e. 用于创建
model_form_obj = XXOOModelForm(request.POST)
#### 页面显示,并提交 #####
# 默认保存多对多
obj = form.save(commit=True)
# 不做任何操作,内部定义 save_m2m(用于保存多对多)
obj = form.save(commit=False)
obj.save() # 保存单表信息
obj.save_m2m() # 保存关联多对多信息
f. 用于更新和初始化
obj = model.tb.objects.get(id=1)
model_form_obj = XXOOModelForm(request.POST,instance=obj)
...
PS: 单纯初始化
model_form_obj = XXOOModelForm(instance=obj)
class TestModelForm(ModelForm): user = ffields.EmailField(label='用户名') #覆盖原方法,执行重写字段方法 class Meta: model = models.UserInfo fields = "__all__" error_messages = { 'user':{'required':'用户名不能为空'}, 'email':{'required':'邮箱不能为空','invalid':'邮箱格式错误'}, } labels = { 'user': '用户名', 'email': "邮箱" } help_texts = { 'user': "帮你一下" } #插件 widgets = { 'user': fwidgets.Textarea(attrs={'class':'c1'}) } #重写字段类 field_classes = { 'user': ffields.EmailField } # def clean_user(self): # pass # # def clean_email(self): # pass def test(request): if request.method == "GET": form = TestModelForm() context = { 'form': form } return render(request,'test.html',context) else: form = TestModelForm(request.POST) if form.is_valid(): form.save() return redirect('http://www.oldboyedu.com') context = { 'form': form } return render(request, 'test.html', context) def edit(request,nid): obj = models.UserInfo.objects.filter(id=nid).first() if request.method == "GET": form = TestModelForm(instance=obj) context = { 'form': form } return render(request, 'edit.html', context) else: form = TestModelForm(instance=obj,data=request.POST,files=request.FILES) if form.is_valid(): form.save() return redirect('http://www.oldboyedu.com') context = { 'form': form } return render(request, 'test.html', context)
注意点:
1、ModelForm中初始化传值使用的是instance = obj,传值是个对象,这里是与Form组件(install={})的不同点。
2、ModelForm往数据库中保存数据仅有一个操作:save(),如果创建的ModelForm的对象,传值没有 instance=obj 初始值,那他会向数据库添加一条数据;若是有是对相应数据进行更改。
浙公网安备 33010602011771号