Django的ModelForm的验证方式相比较form + Model的验证方式有下列区别:
- ModelForm没有form + Model的低耦合性
- ModelForm更适合小型项目,而form + Model则无此限制
- 都是继承BaseForm类,因此也能使用BaseForm中的三个内置钩子
一、ModelForm简单示例:
1、进行modelForm实例之前先在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)
2、在form.py中创建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、在view.py中设置验证函数
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})
4、templas中的HTML模板设置
<body>
<form>
{{ obj.as_p }}
<input type="submit" value="提交"/>
</form>
</body>
二、ModelForm中的内置组件、数据保存、示例
1、ModelForm除modle、fields、exclude组件外,其他组件介绍:
ModelForm
class Meta:
model, # 对应Model的
fields=None, # 字段
exclude=None, # 排除字段
labels=None, # 提示标签设置
"""
labels = {
'username':'用户名',
'email':'邮箱',
}
"""
help_texts=None, # 输入框后的帮助提示信息
"""
help_texts = {
'username':'....',
'email':'xxx@126.com',
}
"""
widgets=None, # 自定义插件
"""
from django.forms import widgets as Fwidgets #需要导入html插件,并且需要重新命名,因为跟关键字重复了
#html插件
widgets = {
"username":Fwidgets.Textarea(attrs={'class':'c1'}) #加上属性
}
"""
error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
"""
error_messages = {
"__all__":{
#定义整体的错误信息
},
'email':{
'required':'邮箱不为空', # 根据required是code值
'invalid':"邮箱格式错误"
}
}
"""
field_classes=None # 自定义字段类 (也可以自定义字段)
"""
#把标签的格式转换为其他格式,这边需要导入fields,但是需要重新起一个别名不然会跟自身的fields冲突,就会报错
from django.forms import fields as Ffields #导入fields,并且取一个别名
field_classes = {
'email':Ffields.URLField #把email格式转换为url格式
}
"""
localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
"""
如:
数据库中
2016-12-27 04:10:57
setting中的配置
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
则显示:
2016-12-27 12:10:57
"""
# ##自定义字段
"""
#modelform可以自定义一些字段,比如10天免登录,这个东西不需要提交到后台的
class UserInfoModelForm(forms.ModelForm):
#自定义字段
is_rmb = Ffields.CharField(
widget=Fwidgets.CheckboxInput() #modelform可以自定义一些字段,比如10天免登录,这个东西不需要提交给后台的
)
class Meta:
model = models.UserInfo
fields = "__all__"
"""
2、models下ForeignKey、ManyToMany的数据保存
1 class UserType(models.Model): 2 caption = models.CharField(max_length=32) 3 4 5 class UserGroup(models.Model): 6 name = models.CharField(max_length=32) 7 8 class UserInfo(models.Model): 9 username = models.CharField(max_length=32) 10 email = models.EmailField() 11 user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE) 12 u2g = models.ManyToManyField(UserGroup) #跟上面的UserGroup建立多对多关系