如何保存Django中用SessionWizard类创建的表单实例?
解决SessionWizard表单数据无法保存到数据库的问题
错误原因
你遇到的'dict' object has no attribute 'save'错误,是因为form_data = [form.cleaned_data for form in form_list]生成的是字典列表,而cleaned_data只是表单验证后的纯数据字典,并不具备模型实例的save()方法。
解决方案
情况1:每个表单对应独立的ModelForm
如果WithdrawForm1和WithdrawForm2都是继承自ModelForm的表单(各自对应不同的模型),直接对表单实例调用save()即可:
修改done方法:
def done(self, form_list, **kwargs): # 逐个保存每个表单对应的模型对象 saved_objects = [] for form in form_list: obj = form.save() saved_objects.append(obj) return render(self.request, 'done.html', {'data': saved_objects})
情况2:两个表单数据属于同一个模型
如果两个表单的字段最终要存入同一个模型,需要合并所有表单的cleaned_data,再创建并保存模型实例:
假设你的目标模型是Withdraw,修改done方法:
from .models import Withdraw # 导入你的模型 def done(self, form_list, **kwargs): # 合并所有表单的验证后数据 combined_data = {} for form in form_list: combined_data.update(form.cleaned_data) # 创建并保存模型对象 withdraw_obj = Withdraw.objects.create(**combined_data) return render(self.request, 'done.html', {'data': withdraw_obj})
额外注意事项
- 确保你的表单类(
WithdrawForm1、WithdrawForm2)如果是ModelForm,已经正确关联了对应的模型和字段。 - 如果涉及文件上传,确认
MEDIA_ROOT配置正确,且服务器对该目录有写入权限,你的file_storage配置看起来是正确的,但需要验证实际路径是否存在。
内容的提问来源于stack exchange,提问作者Thaddeaus Iorbee
相关产品推荐
相关产品推荐

