前言:
如今朋友们对“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