Django如何将视图层计算结果随表单数据存入对应模型
问题原因
- 你的
CoordinateForm仅声明了from_epsg、y、x、to_epsg四个输入字段,计算生成的x_trans、y_trans字段没有被赋值到模型实例中,直接调用form.save()只会保存表单包含的四个字段的值,转换结果自然不会入库。
解决方法
修改views.py中的保存逻辑,调用form.save(commit=False)先获取未写入数据库的模型实例,手动给转换结果字段赋值后,再调用实例的save()方法完成入库。
另外建议优先使用form.cleaned_data获取表单值,而非直接读取request.POST,前者是经过表单验证、类型转换后的合法值,可靠性更高。
1. 调整views.py代码
def coordinate_transform(request): if request.method == 'POST': form = CoordinateForm(request.POST) if form.is_valid(): # 改用cleaned_data获取合法的表单值 from_epsg = form.cleaned_data['from_epsg'].id y = form.cleaned_data['y'] x = form.cleaned_data['x'] to_epsg = form.cleaned_data['to_epsg'].id # 坐标转换逻辑不变 transformer = Transformer.from_crs(int(from_epsg), int(to_epsg)) transformed = transformer.transform(y, x) # 保存逻辑修改 save_data = form.cleaned_data.get('saved') if save_data: # 先获取未入库的模型实例 coord_record = form.save(commit=False) # 手动赋值转换结果 coord_record.y_trans = transformed[0] coord_record.x_trans = transformed[1] # 执行入库 coord_record.save() messages.success(request, "坐标转换数据已存储") context = { 'form': form, 'y': transformed[0], 'x': transformed[1], } return render(request, 'utility/coordinate_transform.html', context) else: form = CoordinateForm() context = {'form': form} return render(request, 'utility/coordinate_transform.html', context)
2. 补充表单的保存选项字段
因为saved是不需要存入模型的额外表单字段,需要在forms.py中显式声明,才能通过form.cleaned_data正常读取:
class CoordinateForm(ModelForm): # 新增保存选项字段,非必填 saved = forms.BooleanField(required=False, label="保存计算结果") class Meta: model = CoordinateTransform fields = ('from_epsg', 'y', 'x', 'to_epsg')
内容的提问来源于stack exchange,提问作者Surveyor Jr
相关产品推荐
相关产品推荐

