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()方法