龙空技术网

Python学习之路Django之ModelForm,快速理解入门及注意点(附源码)

Python乐园 1368

前言:

如今朋友们对“python post form”大约比较讲究,朋友们都需要知道一些“python post form”的相关资讯。那么小编同时在网络上汇集了一些有关“python post form””的相关知识,希望同学们能喜欢,各位老铁们快快来学习一下吧!

一、ModelForm

自己定义的form--->Form--->BaseForm

自己定义的ModelForm--->ModelForm--->BaseModelForm--->BaseForm

从上面可以看出form和ModelForm都是继承BaseForm,所以在Form中有的方法在ModelForm中也是有的,包括is_valid(),cleaned_data,errors

下面是ModelForm的中Meta的使用方法

下面是关于Meta重要参数的使用的例子:

views.py中的代码为:

前端index.html中代码如下:

这样默认访问index页面效果如下:

关于labels参数

可以看出默认情况下输入框左边的lable显示的是列名,如果不在models.py的类中定义字段时添加verbose_name="用户名"参数,默认则是显示的列名,当然如果通过verbose_name="用户名"参数设定,则可以显示自定义的名字,当然这里如果不在models.py中定义的话,可以在ModelForm中通过lables参数指定,注意:lables后面的参数值是字典类型,代码如下:

这样当再次访问页面时效果如下:

关于help_texts参数

注意:help_texts后面的参数值是字典类型代码如下:

这样当再次访问页面时:

关于wigets参数

Modelform本身没有widgets,需要借助于forms,所以当在ModelForm中需要通过widgets参数自定义插件的时候,需要from django.forms import widgets as MFwidgets 这里通过as 将名字进行改变是因为和widgets参数冲突,注意:help_texts后面的参数值是字典类型,具体用法例子如下:

这样当再次访问页面时:

关于error_messages参数

error_messages用于自定义错误信息,注意:error_messages后面的参数值是字典类型,具体使用例子如下:

默认当点击页面提交时,页面的错误信息如下:

通过error_messages用于自定义错误信息后的代码如下:

这样当再次提交的时候,错误信息效果如下:

关于field_classes参数

在model.py的类中我们已经对字段类型进行了设置,当我们想在ModelForm中对字段类型进行修改的时候,首先需要导入from django.forms import fields as MFfields 这里通过通过as 改名防止冲突,注意:field_classes后面的参数值是字典类型,代码例子如下:

上述代码例子中将原本为email邮箱格式的字段更改为了URL字段

以上是关于生成html的用法,下面ModelForm在其他方面也可以方便

二、ModelForm对于数据库的操作

对多的数据的保存

我们将上述页面还原为如下:

我们需要实现的是当用户淑如用户名和邮箱以及选择用户类型后,点击提交后,将信息保存到数据库,并且这里实现了一对多数据库的数据的保存,我们需要将views.py中的index函数的代码进行更改:

这里用的是obj.save()方法,这样当页面信息正确后,点击提交就会将数据保存到数据库中

多对多数据的保存

在上面演示了通过obj.save()可以保存一对多的数据到数据库,同样的,也是可以将多对多数据保存到数据库

现在models.py文件中添加一个用户组的类,并创建多对多关系,修改后的代码如下:

这样页面显示效果如下:

这样当我们填写信息点击提交后,数据库中也就将数据保存在多对多关系

对obj.save()方法的详解

我们点击代码中obj后面的save,查看源码如下:

分析源码我们可以看出,默认参数commit=True,代码中if commit判断中,如果为commit=True,则执行self.instance.save()和self._save_m2m()

self.instance:为当前model的对象,所以可以保存当前表

Self._save_m2m():则表示保存多对多的数据

所以默认情况下commit=True,则当前表数据和多对多表的数据都会保存,当然在这里我们也可以进行拆分,如果commit=False,这个时候,else里只有self.save_m2m=self._save_m2m,进行了赋值,并没有执行任何操作,最终返回self.instance,下面演示拆开的代码例子:

修改后views.py中index函数:

这里instance=obj.save(False),instance.save()这样如果提交数据,就不会保存多对多表的数据,只保存当前表的数据,如果想要保存多对多的数据,则再添加obj.save_m2m()

所以这里我们可以看出

instance=obj.save(False)

instance.save()

obj.save_m2m()

就相当于obj.save()

关于select_related的一个知识点

当在页面中想要列出所有用户时:

Views.py中添加如下代码:

这里有个问题需要注意,这里用select_related时后面只能填写一对多的表跨表,不能填写多对多表进行跨表。

下面是对ModelForm使用的一个小例子:

Views.py中的代码为:

ModelForm.py中的代码为:

两个前端页面,user_edit.html和user_list.html

User_list.html代码如下:

user_edit.html代码如下:

当登陆用户列表页面时:

点击编辑:

上述代码中有几个重要的地方:

当点击编辑的时候,编辑页面会将点击的当前行的用户信息显示出来。

Views.py代码中,当用户通过get访问页面时,

mf= ModelForm.UserInfoModelForm(instance=user_obj)

这里通过instance参数将用户对象传入到ModelForm中,从而显示将当前行的用户信息显示到form页面。

当用户更改用户信息后,点击提交,则可以将更改的用户信息保存到数据库中

mf = ModelForm.UserInfoModelForm(request.POST,instance=user_obj)

这里首先传入request.POST参数,这里是将用户的信息提交,而将用户信息提交到数据库中哪一行,则需要通过instance参数将用户对象user_obj传入,这样当用户更改用户信息后,点击提交则可以将更改后的用户信息保存到数据库中相应的行,如果没有instance参数,则会创建一条新的数据在数据库中

注意:代码中用的is_valid() 这里同样和Form一样预留有钩子:

_clean_fields()

_clean_from()

_post_clean()

注意:在ModelForm中可以定义额外的字段

ModelForm小结:

1、生成HTML标签:在ModelForm类中的class Meta中定义

2、Mf =xxxModelForm(instance=Modelobj)

3、额外的标签

4、和Form中存在的验证,预留的钩子

_clean_fields()

_clean_from()

_post_clean()

5、mf.save()保存数据

通过传入False参数将mf.save()进行分开

Instance = mf.save(False)

Instance.save()

Mf.save_m2m()。

标签: #python post form