将计算值从视图保存到 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")
我有一个 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")