Django中的减法

时间:2019-04-30 16:45:27

标签: python django django-templates django-views

我正在清点,并且我的部分代码可以正常工作:

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”}},或创建了模板标签,但这远非我想做的。
任何帮助将非常感激。

1 个答案:

答案 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似乎是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)

模板上下文现在包含对象id,因此它可以向用户显示其当前名称{{id.name}},候选{{id.cantidad}}等,但是用户无法为它们输入更改的值。

这都是未经测试的,我希望有错误。