Вычитание в Джанго - PullRequest
       16

Вычитание в Джанго

0 голосов
/ 30 апреля 2019

Я делаю инвентаризацию, и у меня есть часть кода, работающая правильно:

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 голосов
/ 01 мая 2019

Это все еще не совсем понятно, но всякий раз, когда вы хотите выполнить некоторую настраиваемую обработку экземпляра модели сверх того, что делает 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}}, cantidad {{id.cantidad}} и т. Д., Но пользователь не может вводить измененные значения для них.

Это все не проверено, и я ожидаю, что есть ошибки.

...