将计算值从视图保存到 Django 中的模型

Save Calculated Value from View to Model in Django

我有一个 Django 应用程序,它让用户可以选择是否在表单中保存计算。

如果用户说他们想保存计算,我想将计算结果连同输入的详细信息一起保存在数据库中。

对于用户输入我已经可以保存了。当保存由 views.py.

处理的计算结果时,挑战就来了

我的代码如下:

为了我的 views.py

def coordinate_transform(request):
    if request.method == 'POST':
        form = CoordinateForm(request.POST)
        if form.is_valid():
            from_epsg = request.POST.get('from_epsg')
            y = request.POST.get('y')
            x = request.POST.get('x')
            to_epsg = request.POST.get('to_epsg')
            # Transform Coordinates
            transformer = Transformer.from_crs(int(from_epsg), int(to_epsg))
            transformed = transformer.transform(y, x)
            # Save to Database? 
            save_data = request.POST.get('saved')
            if save_data == 'on':
                form.save()
                messages.success(request, "Coordinate Transormation data stored")

            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)

在上面的代码中,form.save() 工作正常,但没有保存计算。我尝试使用 Django Querysets 保存模型,但它不起作用。

这是我的model.py

class CoordinateTransform(models.Model):
    from_epsg = models.ForeignKey(CRS, on_delete=models.CASCADE, related_name='from_epsg')
    x = models.FloatField(verbose_name="X/Lon")
    y = models.FloatField(verbose_name="Y/Lat")
    to_epsg = models.ForeignKey(CRS, on_delete=models.CASCADE, related_name='to_epsg')
    x_trans = models.FloatField(verbose_name='X-Transformed', null=True, blank=True)
    y_trans = models.FloatField(verbose_name='Y-Transformed', null=True, blank=True)
    stored_on = models.DateTimeField(auto_now_add=True)

最后是我用来从 forms.py

收集用户输入的表单
class CoordinateForm(ModelForm):
    # some widget stuff here
    class Meta:
        model = CoordinateTransform
        fields = ('from_epsg', 'y', 'x', 'to_epsg')

我怎样才能确保计算结果也存储在数据库中?

您可以使用 form.save(commit=False) 延迟保存对象,然后像这样添加计算字段:

def coordinate_transform(request):
    if request.method == 'POST':
        form = CoordinateForm(request.POST)
        if form.is_valid():
            ...
            # Save to Database? 
            save_data = request.POST.get('saved')
            if save_data == 'on':
                instance = form.save(commit=False)
                instance.x_trans = transformed[1]
                instance.y_trans = transformed[0]
                instance.save()
                messages.success(request, "Coordinate Transormation data stored")