ModelForm
1、引入
from django.forms imoprt ModelForm from django.forms import widgets as wd
2、前戏
models.py:
from django.db import models class Role(models.Model): caption = models.CharField(max_length=32) def __str__(self): return self.caption class UserType(models.Model): title = models.CharField(max_length=32) roles = models.ManyToManyField('Role') class UserInfo(models.Model): name = models.CharField(max_length=32) email = models.EmailField(max_length=32) ut = models.ForeignKey('UserType')
3、视图
from django.shortcuts import render,redirect,HttpResponse from app01 import models from django.forms import Form,ModelForm from django.forms import fields from django.forms import widgets as wd # class Role(Form): # caption = fields.CharField(max_length=32,required=True) # # def role_add(request): # if request.method == "GET": # form = Role() # return render(request,'role_add.html',{'form':form}) # else: # form = Role(request.POST) # if form.is_valid(): # models.Role.objects.create(**form.cleaned_data) # # models.Role.objects.create(**{'catpion':'123'}) # else: # return render(request, 'role_add.html', {'form': form}) def role(request): roles = models.Role.objects.all() return render(request,'role.html',{'roles':roles}) class Role(ModelForm): class Meta: model = models.Role fields = "__all__" def role_add(request): if request.method == "GET": form = Role() return render(request,'role_add.html',{'form':form}) else: form = Role(request.POST) if form.is_valid(): form.save() # models.Role.objects.create(**form.cleaned_data) # models.Role.objects.create(**{'catpion':'123'}) return redirect('/role/') else: return render(request, 'role_add.html', {'form': form}) def role_edit(request,nid): obj = models.Role.objects.filter(id=nid).first() if not obj: return HttpResponse('数据不存在') if request.method == "GET": form = Role(instance=obj) return render(request,'role_edit.html',{'form':form}) else: form = Role(data=request.POST,instance=obj) if form.is_valid(): form.save() return redirect('/role/') else: return render(request, 'role_edit.html', {'form': form}) def user_type(request): user_type_list = models.UserType.objects.all() return render(request,'user_type.html',{'user_type_list':user_type_list}) class UserTypeModeForm(ModelForm): title = fields.CharField(max_length=6,required=True,widget=wd.Textarea()) #支持自定义字段,如果重名了,那就覆盖(以自己添加的为准,如果不重名就新生成) class Meta: model = models.UserType # 对应表名 fields = "__all__" # 所有字段 # fields = ['caption',] # exclude = ['catpion'] error_messages = { 'title':{'required':'名称不能为空','invalid':'格式错误'} } # 错误信息 widgets = { 'title':wd.TextInput(attrs={'class':'c1'}) } # 定制指定字段的input框类型及属性 # 支持钩子函数 def user_type_add(request): if request.method == "GET": form = UserTypeModeForm() # 生成空表传到前端 return render(request,'user_type_add.html',{'form':form}) else: form = UserTypeModeForm(request.POST) # 把拿到的数据传入form中进行校验 if form.is_valid(): # 通过校验 form.save() # 把拿到的数据新建一条记录存到数据库中 return redirect('/usertype/') else: return render(request, 'user_type_add.html', {'form': form}) def user_type_edit(request,nid): obj = models.UserType.objects.filter(id=nid).first() if not obj: return HttpResponse('...') if request.method == 'GET': # 显示默认值 form = UserTypeModeForm(instance=obj) # 数据库取值,前端显示 return render(request,'user_type_edit.html',{'form':form}) else: form = UserTypeModeForm(instance=obj,data=request.POST) # 括号内两个参数都不能少,一个是原记录(instance),一个是传过来的值(data),这样可以做到更新操作 if form.is_valid(): form.save() # 更新后的值更新到数据库(不是新建) return redirect('/usertype/') else: return render(request, 'user_type_edit.html', {'form': form})
4、前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <form method="post" novalidate> {% csrf_token %} {{ form.as_p }} <input type="submit" value="提交"> </form> </body> </html>
当你生成的form表单中排除了一些字段的值后,当你应用form.save()方法时会报错,需要使用
form.instance.field_name = value
方式,来把不全的字段补齐然后再执行form.save()方法