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