python - Django中的减法
问题描述
我正在做一个清单,我的部分代码工作正常:
def add_art_view(request, pk, template_name='invstock/art_form.html'):
id = get_object_or_404(Stock, pk=pk)
form = StockForm(request.POST or None, instance=id)
context = {
'form': form
}
if form.is_valid():
form.save()
messages.success(request, ('Register Edited Successfully'))
return redirect('invstock:art_list_view')
return render(request, template_name, context)
{% extends "base.html" %}
{% block content %}
{% if user.is_authenticated %}
<h2><a href="{% url 'invstock:art_list_view' %}">ART FORM</a></h2>
<form method="post">{% csrf_token %}
<div class="form-group">
<label>Cantidad</label>{{ form.cantidad}}
<label>Cantidad a debitar</label>{{ form.var_resta}}
<label>Name</label>{{ form.name}}
<label>ID</label>{{ form.id}}
</div>
<input type="submit" value="Submit" />
</form>
{% endblock %}
class StockForm(forms.ModelForm):
var_resta = forms.DecimalField(initial= Decimal('0'), decimal_places=2, max_digits=5)
name = forms.CharField(initial="None",)
class Meta:
model = Stock
fields = [
'id',
'cantidad',
'name',
'var_resta',
]
class Stock(models.Model):
id = models.IntegerField(primary_key=True)
cantidad = models.DecimalField(decimal_places=2, max_digits=5)
var_resta = models.DecimalField(default=Decimal('0'), decimal_places=2, max_digits=5)
name = models.CharField(default="None",max_length=100)
我的意图是:从视图中减去 CANTIDAD 字段减去 VAR_RESTA 字段,并将结果值存储在 CANTIDAD 字段中,例如
CANTIDAD = CANTIDAD - VAR_RESTA,我已经扩展了数周,因为在所有研究中,视频,课程,一直没能找到答案,只能从模板上分析怎么做,但不是我需要的。
我找到了一些示例,例如 {{ myval|add:"-5" }},或者创建模板标签,但这远不是我想做的。
任何帮助将非常感激。
解决方案
仍然不完全清楚,但是每当您想对模型实例进行一些超出 ModelForm 所做的自定义处理(它只是存储表单中的有效数据)时,您可以使用序列
if form.is_valid():
obj = form.save( commit=False)
# now update the object further
...
obj.save() # commit the (altered) obj to the database
我对您发布的内容感到有些困惑,因为var_resta
它似乎Meta
是ModelForm
. 不知何故,这样做感觉不对
obj.cantidad = obj.cantidad - obj.var_resta
但这就是问题的意思。我猜也许 var_resta 可能应该是在数据库中声明的附加字段,ModelForm
但不是数据库中表的字段,在这种情况下它将是
obj.cantidad = obj.cantidad - form.cleaned_data['var_resta']
[更新]
好的,现在更清楚了。请参阅对问题的评论。我建议这根本不是使用 ModelForm 的情况,因为只有对象上的一个字段要更新,而不是直接复制用户输入的数字。相反,只是一个带有要获取的字段的普通表单var_resta
。
class StockForm(forms.Form):
var_resta = forms.DecimalField(initial= Decimal('0'), decimal_places=2, max_digits=5
在视图中:
def add_art_view(request, pk, template_name='invstock/art_form.html'):
id = get_object_or_404(Stock, pk=pk)
form = StockForm(request.POST or None )
context = {
'form': form,
'id':id
}
if form.is_valid():
id.cantidad = id.cantidad - form.cleaned_data['var_resta']
id.save()
messages.success(request, ('Register Edited Successfully'))
return redirect('invstock:art_list_view')
return render(request, template_name, context)
模板上下文现在包含 object id
,因此它可以向用户显示其当前 name {{id.name}}
、cantidad{{id.cantidad}}
等,但用户不能为这些输入更改的值。
这一切都未经测试,我预计会有错误。
推荐阅读
- python-3.x - Seaborn Catplot 需要 10 分钟才能完成
- php - PHP中引号内的If...Else语句
- excel - talend 中的 tREST 组件异常处理
- devops - 我想将挂载 tomcat 服务器绑定到我的本地机器
- python - 如何使用 python 将 netcdf 文件转换为 .csv 工作表
- swift - 如何在 swift Xcode 中将 TextView 添加到 VStack 的顶部?
- php - 准备好的 mysqli 语句不适用于新的 cpanel 主机
- logging - Google Apps 脚本:记录器不打印
- docker - 运行本地 ansible 创建本地 docker Image
- python - 在 Python 中使用 LiquidFiles 发送电子邮件