Model + Form ----> 验证 + 数据库操作
class UserInfo(models.Model):
username = models.CharField(max_length=32,verbose_name='用户名')
email = models.EmailField(verbose_name='密码')
user_type = models.ForeignKey(to='User_type',to_field='id',verbose_name='类型')
from django import forms
from django.forms import fileds as Ffields
from django.forms import widgets as Fwidgets *
class UserInfoModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo
fields = '__all__' #生成所有的字段标签
#fields = ['username','email'] #生成列表字段的标签
#exclude = ['email'] #生成除了列表字段的标签
Meta中的参数
labels = {
'username':'xxx',
'email':'邮箱',
}
help_texts={ # 帮助提示信息
'username':'这里填写用户名',
}
widgets={ # 自定义插件,widgets为关键字不能改变,导包时要起别名
'usernmae':Fwidgets.Textarea(attrs={'k':'v'}),
}
error_messages={ # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
'__all__':{
...
}
'username':{
'required':'用户名不能为空',
'invalid':'用户名不合法'
}
}
field_classes={ # 自定义字段类 (也可以自定义字段)
'email':Ffields.URLField #使用form中的类,因为关键字重复,导包时也要起别名
}
localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据 UTC --> 东八区时间
如:
数据库中
2016-12-27 04:10:57
setting中的配置
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
则显示:
2016-12-27 12:10:57
钩子与(Form一样):
def clean_username(self):
old = self.cleaned_data['username']
return old
#每个字段验证成功之后,可以追加操作
ModelForm额外字段:
例子:一个月免登录,这个字段不用做验证
class UserInfoModelForm(forms.ModelForm):
is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput())
class Meta:
model = models.UserInfo
函数处理:
def user_edit(request, nid):
# 获取当前id对象的用户信息
# 显示用户已经存在数据
if request.method == "GET":
user_obj = models.UserInfo.objects.filter(id=nid).first()
mf = UserInfoModelForm(instance=user_obj)
return render(request,'user_edit.html',{'mf': mf, 'nid': nid})
elif request.method == 'POST':
user_obj = models.UserInfo.objects.filter(id=nid).first()
mf = UserInfoModelForm(request.POST,instance=user_obj)
#更新操作需要添加instance参数,创建新数据不需要添加
if mf.is_valid():
# obj.save() 拆分save操作↓↓↓↓↓↓
instance = mf.save(False) #让save操作失效
instance.save() #保存当前类
mf.save_m2m() #保存多对多中间关联表
else:
print(mf.errors.as_json())
return render(request,'user_edit.html',{'mf': mf, 'nid': nid})
继承
Form -> BaseForm
UserInfoModelForm -> ModelForm -> BaseModelForm -> BaseForm
BaseForm 中定义了is_valid()、cleaned_data、errors方法
验证方法和Form一样