Reputation: 1
I am unable to access the deposit()
method within the Account
class from the views. Gives me the error: deposit() missing 1 required positional argument: 'amount'
I am calling the method with:
Account.deposit(amount)
Views:
def home(request):
return render(request, 'automatedbankteller/home.html')
def about(request):
return render(request, 'automatedbankteller/about.html')
@login_required
def transactions(request):
context = {
'transactions': Transaction.objects.filter(sender=request.user)
}
return render(request, 'automatedbankteller/transactions.html', context)
@login_required
def my_accounts(request):
context = {
'accounts': Account.objects.filter(account_owner=request.user)
}
return render(request, 'automatedbankteller/my_accounts.html', context)
@login_required
def deposit(request):
if request.method == 'POST':
form = UserDepositForm(request.POST)
if form.is_valid():
amount = request.POST['amount']
print(amount)
Account.deposit(amount)
#form.save()
messages.success(request, f'The amount has been deposited into your account!')
return redirect('ABT-my_accounts')
else:
form = UserDepositForm(instance=request.user)
return render(request, 'automatedbankteller/deposit.html', {'form': form})
Models:
class Account(models.Model):
ACCOUNT_TYPES = (
('SA', 'Savings'),
('CA', 'Checking'),
)
accountID = models.IntegerField()
account_amount = models.DecimalField(max_digits=20, decimal_places=2)
account_type = models.CharField(max_length=2, choices=ACCOUNT_TYPES)
account_owner = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return str(self.accountID)
def get_balance(self):
return self.account_amount
def deposit(self, amount):
self.account_amount = self.account_amount + amount
return
def withdraw(self, amount):
self.account_amount = self.account_amount - amount
return
Urls:
urlpatterns = [
path('', views.home, name='ABT-home'),
path('about/', views.about, name='ABT-about'),
path('my_accounts/', views.my_accounts, name='ABT-my_accounts'),
path('account_history/', views.transactions, name='ABT-transactions'),
path('deposit/', views.deposit, name='ABT-deposit'),
]
Forms:
class UserDepositForm(forms.ModelForm):
amount = forms.DecimalField(max_digits=20, decimal_places=2)
class Meta:
model = Account
fields = ['account_type', 'amount']
Upvotes: 0
Views: 198
Reputation: 546
Account.deposit(amount) here Account is class . you need call the deposit method on instance of this class like.
account = Account.objects.get(id=1)
account.deposit(amount)
Upvotes: 1
Reputation: 2547
Your deposit()
needs two arguments - the class instance and the amount. So you need to first create an Account
instance and then use the method. Also, since you are not returning the updated amount, you can call save()
method inside the method itself.
class Account(models.Model):
...
def deposit(self, amount):
self.account_amount = self.account_amount + amount
self.save()
return
You need to call the deposit
on an instance first.
# views.py
@login_required
def deposit(request):
if request.method == 'POST':
form = UserDepositForm(request.POST)
if form.is_valid():
amount = request.POST['amount']
print(amount)
account = form.save(commit=False) #no commit in DB
account.deposit(amount) # use class instance
messages.success(request, f'The amount has been deposited into your account!')
return redirect('ABT-my_accounts')
else:
form = UserDepositForm(instance=request.user)
return render(request, 'automatedbankteller/deposit.html', {'form': form})
You can also return the updated amount from the deposit
method, but then you will need to call save()
yourself.
Upvotes: 0