在上节一中,我们 class Meta 中使用了一些元数据项,比如说 exclude、labels 以及 fields,当然还有些其他的选项,在 Django 官方网站 ModelForm 的定义如下所示
modelform_factory(model,form = ModelForm,fields = None,exclude = None,formfield_callback = None,widgets = None,localized_fields = None,labels = None,help_texts = None,error_messages = None,field_classes = None)
在这里给大家依次进行介绍这些 Meta 选项。
Creating a ModelForm without either the'fields'attribute or the'exclude'attribute is prohibited。
labels={
'title':'标题',、
'price':'价格'
}
help_texts={
"title":"书籍的名称"
"price':"书籍价格"
}
class Meta:
model=UserInfo
fields="__all__"
widgets={'password':widgets.PasswordInput()}
field_calss={"title":forms.URLField}
def save(self, commit=True):
if self.errors:
raise ValueError(
"The %s could not be %s because the data didn't validate." % (
self.instance._meta.object_name,
'created' if self.instance._state.adding else 'changed',
)
)
if commit:
# 除了保存当前Model实例,还会保存多对多关系数据
self.instance.save()
self._save_m2m()
else:
# 将保存多对多数据方法赋值给save_m2m,save返回后可以手动调用
# saving of m2m data.
self.save_m2m = self._save_m2m
return self.instance
save.alters_data = True
通过源码不难理解它的实现逻辑,下面主要讲解一下 save 方法的基本使用,主要有三个场景。如下所示:f = BookForm(request.POST) new_book = f.save()2) 从数据库中取出 models 的对象,然后通过 form 参数 instance 方法能够实例化该 form,这个主要用来查看具体的信息,如下所示:
a = Book.objects.get(id=1) f = BookForm(instance=a) f.save()3) 如果既有 Post 又有 instance,则以 Post 提交数据为主,这个主要用来修改具体的信息。如下所示:
a = Book.objects.get(id=1) f = BookForm(request.POST, instance=a) f.save()save 方法接受一个 commit 参数,默认为 True,可以实现 Model 实例的保存以及多对多关系数据的保存。如果在使用 save 方法时设置了 commit 为 False,则不会执行保存动作。此时,可以对返回的实例对象做一些操作后,再执行 save() 方法。
user=UserModelForm(request.Post)
if user.is_valid():
user=user.save(commit=False)
user.username=request.username
user.save()
return render(request,'index/user_add.html',locals())
本节内容也至此完毕,在下一节《Django表单系统工作原理详述》,我们将分析一下 Django 表单系统的工作原理,由浅入深,各位小伙伴要做好心里准备哦!
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有