我正在清点,并且我的部分代码可以正常工作:
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”}},或创建了模板标签,但这远非我想做的。
任何帮助将非常感激。
答案 0 :(得分:0)
这还不是很清楚,但是每当您想要对模型实例进行一些超出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)
模板上下文现在包含对象id
,因此它可以向用户显示其当前名称{{id.name}}
,候选{{id.cantidad}}
等,但是用户无法为它们输入更改的值。
这都是未经测试的,我希望有错误。