- fromdjango.shortcutsimport render,HttpResponse
- fromapp01import models
- fromdjangoimport forms
- fromdjango.formsimportfields as Ffields#给导入的fields设置别名为Ffields
- fromdjango.formsimportwidgets as Fwidgets#给导入的widgets设置别名为Fwidgets
- class UserInfoModelForm(forms.ModelForm):
- is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput())#自定义在界面显示的单选框等,而且不用保存在数据库
- classMeta:#class Meta里一定不要加逗号model = models.UserInfo#指定去UserInfo表里获取数据fields ='__all__' #在界面显示所有字段
- # fields = ['username','email']#只在界面显示'username','email'字段
- # exclude = ['username'] #不在界面显示'username'字段labels = {#设定输入框的标签名
- 'username':'用户名',
- 'email':'邮箱',
- }
- help_texts = {#在输入框后面自定义帮助信息
- 'username':'我是帮助信息'
- }
- widgets = {#自定义输入框的属性,即自定义html标签的class
- 'username': Fwidgets.Textarea(attrs={'class':'c1'})#将输入框设置为text文本框,并添加CSS:'c1'
- }
- error_messages = {#自定义错误信息提示
- '__all__':{#给整体设置错误信息,跟form中的all一样
- },
- 'email': {#给每个字段设定错误信息
- 'required':'邮箱不能为空',
- 'invalid':'邮箱格式错误..',
- }
- }
- field_classes = {#将email输入框的格式验证修改为必须输入URL格式才正确
- # 'email': Ffields.URLField
- }
- localized_fields=('ctime',)#将数据库时间转化为北京时间,括号里写需要转化时间的字段,需要在settings里设置
- #timezone
- class UserInfoForm(forms.Form):
- username = Ffields.CharField(max_length=32)
- email = Ffields.EmailField()
- user_type = Ffields.ChoiceField(
- choices=models.UserType.objects.values_list('id','caption')#以'id','caption'为select框中的数据
- )
- def __init__(self, *args, **kwargs):
- super(UserInfoForm,self).__init__(*args, **kwargs)
- self.fields['user_type'].choices = models.UserType.objects.values_list('id','caption')#加上这个init函数
- #后,就能将新添加到数据库中的数据动态显示到select框啦
- defindex(request):#将数据展示在界面
- ifrequest.method =="GET":
- obj = UserInfoModelForm()
- returnrender(request,'index.html',{'obj': obj})
- elifrequest.method =="POST":
- obj = UserInfoModelForm(request.POST)
- ifobj.is_valid():#obj.is_valid()只能为true或falseobj.save()#自动将前端提交的数据保存在数据库
- # print(obj.cleaned_data) #obj.cleaned_data以字典的形式获取前端提交的数据
- # print(obj.errors.as_json())
- returnrender(request,'index.html',{'obj': obj})
- def user_list(request):
- li = models.UserInfo.objects.all().select_related('user_type')#获取UserInfo表中的所有数据,并且跨表将与UserInfo
- # 关联的user_type表中的数据也取出来,注意括号中写UserInfo类中的关联字段名,不可以写多对多的字段名,否则报错,
- #前端html跨表取user_type表数据:{% for row in li %} {{ row.user_type.caption }}
- returnrender(request,'user_list.html',{'li': li})
- def user_edit(request, nid):
- # 1.获取当前id对应的用户信息
- # 2.显示用户已经存在数据
- ifrequest.method =="GET":#数据展示user_obj = models.UserInfo.objects.filter(id=nid).first()#根据nid获取UserInfo表中的相关数据的第一条mf = UserInfoModelForm(instance=user_obj)#将mf传到前端就可以自动生成网页,括号中的instance参数是显示默认值
- returnrender(request,'user_edit.html',{'mf': mf,'nid': nid})#跳转回本页面,也可以跳转到其他页面
- elifrequest.method =='POST':#数据修改user_obj = models.UserInfo.objects.filter(id=nid).first()
- mf = UserInfoModelForm(request.POST,instance=user_obj)#如果不加这句,就会自动在数据库中新添加数据,而不是修改
- #已存在的数据
- if mf.is_valid():
- mf.save()#将修改的数据写入到数据库中
- else:#如果出现异常,打印错误信息
- print(mf.errors.as_json())
- returnrender(request,'user_edit.html',{'mf': mf,'nid': nid})
来源: