day23-ModelForm基本使用
一、前言
之前我们讲了,from + model 去验证,我个人以后验证也用这种方式,因为这种方式降低了耦合度,就是from只是单纯的字段验证,而model就是单纯的数据库设置,两者之间并没有直接的联系,但是今天我们要学习的是ModelForm,它跟上面还不一样,它是一个整体,所以它的耦合度更高一些,我们一般情况下,只写一些小项目的时候会用这个modelfrom,如果写大项目的话,还是建议用 form + model 这种方式去验证,好啦,废话不多说了,下面我们就来学习一下ModelForm吧!
二、创建models
说明:我们创建modelForm之前先设置两张表,虽然只用到其中的一张,但是我们还是弄两张比较好,在app下的models中去创建
from django.db import models # Create your models here. class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Model): username = models.CharField(max_length=32) email = models.EmailField() user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE)
三、创建modelForm
3.1、创建modelform
说明:我们先创建modelfrom,modelform是继承 BaseModelForm ->继承BaseForm,所以最终还是继承的BaseForm,这个跟我们的Form继承是一个老祖宗,这个可以 根据 ctrl + ModelForm去找一下
from app01 import models from django import forms from django.forms import fields class UserInfoModelForm(forms.ModelForm): #还是在forms里面,需要继承modelform class Meta: model = models.UserInfo #表示去哪一个类里面去获取字段 # fields = '__all__' #能获取字段,也可以对这张表进行增删改查,all表示展示所有列 fields = ['username',] #只选择username列,这个是UserInfo中的字段 # # exclude = ["username"] #排除username字段,展示其他字段
3.2、index函数验证
说明:我们设置好modelform之后,去验证modelform
def index(request): if request.method == "GET": obj = UserInfoModelForm() #验证时,创建modelform对象 return render(request,'index.html',{'obj':obj}) elif request.method == "POST": obj = UserInfoModelForm(request.POST) #在views函数里面做校验 return render(request,'index.html',{'obj':obj})
3.3、模板设置
说明:根据index函数,我们获取标签
<body> <form> {{ obj.as_p }} <input type="submit" value="提交"/> </form> </body>
呈现的效果如下图:
四、总结
- modelform的继承关系如下:UserInfoModelForm(自己创建的modelfrom类) -> ModelForm -> BaseModelForm -> BaseForm
- form 的继承如下:UserInfForm(自己创建的form类) -> Form -> BaseForm(is_valid()验证...)
- modelfrom是跟model紧紧的联系在一起的,所有的验证字段是直接冲model去拿的
- modelform和form老祖先都是一样的
- modelform适合小型项目,form验证大小项目都适合(推荐)