在Django中将计算值从视图保存到模型
Posted
技术标签:
【中文标题】在Django中将计算值从视图保存到模型【英文标题】:Save Calculated Value from View to Model in Django 【发布时间】:2021-10-28 05:20:18 【问题描述】:我有一个 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')
如何才能确保计算结果也存储在数据库中?
【问题讨论】:
【参考方案1】:您可以使用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中将计算值从视图保存到模型的主要内容,如果未能解决你的问题,请参考以下文章
我如何在 django 的同一视图功能中将最近保存的数据发送到模板中
如何将值从视图传递到不可编辑的字段django python