Django复制Job表数据到Job_removed表SQLite保存失败咨询
报错根因
你将jobname、owner等必填字段配置到了JobRemovedForm的fields列表中,但你的POST请求并没有提交这些字段的值,Django表单在校验时会默认检查这些必填字段是否存在提交值,不存在就会抛出「字段必填」的错误。
你的业务场景下这些字段都是从已有Job对象直接复制,不需要用户提交,所以不需要把这些字段放到表单的fields配置里。
解决方法
1. 修正forms.py
把表单的fields改回空列表,不需要声明任何你后台主动赋值的字段:
class JobRemovedForm(ModelForm): class Meta: model = Job_removed fields = []
2. 修正views.py
保留你已经加上的commit=False逻辑,同时补全所有需要复制的字段,删除redirect方法中多余的上下文参数(redirect不需要传递上下文,上下文仅用于render方法):
def job_delete(request,pk): job=Job.objects.get(pk=pk) jobdetail = Job_detail.objects.get(job=pk) if request.method == "POST": jobr = JobRemovedForm(request.POST) if jobr.is_valid(): jr = jobr.save(commit=False) # 从原Job对象完整复制所有字段 jr.jobname = job.jobname jr.owner = job.owner jr.enabled = job.enabled jr.freq_type = job.freq_type jr.freq_interval = job.freq_interval jr.freq_recurrence = job.freq_recurrence jr.start_date = job.start_date jr.end_date = job.end_date jr.start_time = job.start_time jr.end_time = job.end_time jr.date_added = job.date_added jr.version = job.version jr.save() # 若业务需要删除原Job记录,可加上下面这行 # job.delete() return redirect('/job/') else: print(jobr.errors) jobr = JobRemovedForm() return render(request, 'interface/job_removed.html', {'job':job, 'jobdetail':jobdetail, 'jobr':jobr}) return render(request, 'interface/job_removed.html', {'job':job, 'jobdetail':jobdetail})
如果你后续有需要用户输入的字段(比如删除备注等),只需要把这些用户提交的字段加到
fields列表即可,后台主动赋值的字段无需添加。
内容的提问来源于stack exchange,提问作者L.Calvin
相关产品推荐
相关产品推荐

