seijih
seijih

Reputation: 1

django deposit() missing 1 required positional argument: 'amount'

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

Answers (2)

biswa1991
biswa1991

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

Aman Garg
Aman Garg

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

Related Questions