from django.shortcuts import render,HttpResponse
from app.myforms import*defregister(request):if request.method=='GET':
form_obj=UserForm()return render(request,'注册页面.html',locals())elif request.method=="POST":
form_obj = UserForm(data=request.POST,files=request.FILES,)if form_obj.is_valid():print("打印cleaned_data=",form_obj.cleaned_data)# 方式1:form.save()自动保存数据到数据库(但必须是继承自ModelForm),会自动保存外键字段数据,且多传了数据库没有的字段也不会报错# form_obj.save()# 方式2:通过orm手动保存数据到数据库,不能保存多对多的外键字段数据,会报错,需要手动保存from django.db import transaction
with transaction.atomic():
hobbys=form_obj.cleaned_data.pop("hobby")# 取出多对多字段,创建好user对象之后再调用user.hobby.set(hobbys)
form_obj.cleaned_data.pop("repassword")# 删除数据库中不需要的字段
form_obj.cleaned_data.pop("xxx")# 删除数据库中不需要的字段
user=User.objects.create(**form_obj.cleaned_data)# 模型类ManyToManyField字段只能使用 "tableobj.外键字段.set(数据列表)"来保存!且不能调用tableobj.外键字段.save()
user.hobby.set(hobbys)# 会直接保存数据到user_hobby表中,不能再调用user.hobby.save()会报错user对象没有hobby属性# user.hobby.save() # AttributeError: 'User' object has no attribute 'bobby'# user.hobby=hobbys 错误写法!user表实际上并没有hobby字段,只有一对一和一对多字段的数据能这样写入# Direct assignment to the forward side of a many-to-many set is prohibited. Use hobby.set() insteadreturn HttpResponse('数据插入成功!')else:return render(request,'注册页面.html',{'form_obj':form_obj})return HttpResponse("请求不允许!")