django deposit () отсутствует 1 обязательный позиционный аргумент: «сумма» - PullRequest
0 голосов
/ 22 апреля 2019

Мне не удалось получить доступ к методу deposit() в классе Account из представлений.Дает мне ошибку: deposit() missing 1 required positional argument: 'amount' Я вызываю метод с:

Account.deposit(amount)

Просмотры:

    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})

Модели:

    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

URL:

    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'),
    ]

Формы:


    class UserDepositForm(forms.ModelForm):
        amount = forms.DecimalField(max_digits=20, decimal_places=2)

        class Meta:
            model = Account
            fields = ['account_type', 'amount']

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Account.deposit (сумма) здесь Аккаунт является классом.вам нужно вызвать метод депозита на экземпляре этого класса, как.

account = Account.objects.get(id=1)
account.deposit(amount)
0 голосов
/ 22 апреля 2019

Вашему deposit() нужны два аргумента - экземпляр класса и сумма.Поэтому вам нужно сначала создать экземпляр Account, а затем использовать метод.Кроме того, поскольку вы не возвращаете обновленную сумму, вы можете вызвать метод save() внутри самого метода.

class Account(models.Model):
   ...
def deposit(self, amount):
    self.account_amount = self.account_amount + amount
    self.save()
    return

Сначала необходимо вызвать deposit в экземпляре.

# 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})

Вы также можете вернуть обновленную сумму из метода deposit, но тогда вам нужно будет самостоятельно вызвать save().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...