首页 > 解决方案 > 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" }},或者创建模板标签,但这远不是我想做的。
任何帮助将非常感激。

标签: pythondjangodjango-templatesdjango-views

解决方案


仍然不完全清楚,但是每当您想对模型实例进行一些超出 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它似乎MetaModelForm. 不知何故,这样做感觉不对

    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}}等,但用户不能为这些输入更改的值。

这一切都未经测试,我预计会有错误。


推荐阅读