Причина, по которой это не работает, заключается в том, что вы никогда не .save()
свой Employee
объект. Кроме того, вы должны перенаправить в случае успешного запроса POST для реализации шаблона Post / Redirect / Get [wiki] .
from django.shortcuts import redirect
def updatingBalance(request):
if request.method=="POST":
ven_id = request.POST["groupOfDefaultRadios"]
amount = request.POST["amt"]
x = employee.objects.get(name=request.user)
x.balance = x.balance - int(amount)
<b>x.save()</b>
v = vendor.objects.get(id=ven_id)
w = employee.objects.get(id=x.id)
transaction.objects.create(vendor_id=v, emp_id=w, debit=amount, credit=0)
<b>return redirect(updatingBalance)</b>
<b>y = employee.objects.get(name = request.user)</b>
return render(request, 'profiles/userLogin.html', {'model': y})
При этом я Настоятельно советуем , а не хранить баланс в модели Employee
. Это создаст много проблем, таких как условия гонки , чтобы поддерживать баланс правильно обновленным.
Вместо этого вы можете сделать аннотацию, которая рассчитывает для сотрудника баланс с помощью:
class EmployeeManager(models.Manager):
def get_queryset(self):
return super().get_queryset().annotate(
<b>balance=Sum(F('transaction__credit')-F('transaction__debit'))</b>
)
class Employee(models.Model):
name = models.OneToOneField(User, on_delete=models.CASCADE)
id = models.CharField(max_length=20, primary_key=True)
# <i>no</i> balance
<b>objects = EmployeeManager()</b>
Здесь мы, таким образом, рассчитаем агрегат по связанным Transaction
объектам.
В этом случае представление будет таким:
from django.shortcuts import redirect
def updatingBalance(request):
if request.method=="POST":
ven_id = request.POST["groupOfDefaultRadios"]
amount = request.POST["amt"]
x = employee.objects.get(name=request.user)
v = vendor.objects.get(id=ven_id)
transaction.objects.create(vendor_id=v, emp_id=x, debit=amount, credit=0)
<b>return redirect(updatingBalance)</b>
y = employee.objects.get(name=request.user)
return render(request, 'profiles/userLogin.html', {'model': y})
Итак, мы делаем не нужно обновлять поле баланса, оно просто обновляется путем добавления транзакции.
Примечание : обычно модели Django, как и все классы в Python имя дано в PerlCase , а не snake_case , поэтому оно должно быть: Employee
вместо employee
.
Примечание : когда вы передаете объект в шаблон, то есть , а не модель, это объект модели. Таким образом, вы можете изменить имя переменной с 'model'
на 'employee'
.