首页 > 解决方案 > 我如何允许 django 管理员用户进行汇款,这将扣除发件人帐户并记入收款人帐户?

问题描述

我有两张桌子——一张用于银行账户,另一张用于交易。当用户进行交易时(从他/她自己的账户转账到另一个账户):首先我将发送者的帐号,接收者的帐号,发送的金额和交易日期保存到交易表中,其次我还可以从帐户表中的发件人帐户余额中扣除金额,然后将金额添加到收件人的帐户余额中。所有这些都由django中的单个视图处理。

处理传输的两个表和视图如下:

class Account(models.Model):
      ACCOUNT_TYPES = (
          ('SA' , 'Savings Account' ),
          ('CA' , 'Current Account' ),
          ('JA' , 'Joint Account' ),
      )
      owner = models.ForeignKey(User, on_delete=models.CASCADE, 
      related_name='accounts', verbose_name='The related user')
      account_type = models.CharField(max_length=2, choices=ACCOUNT_TYPES)
      account_number = models.CharField(max_length=13, unique=True)
      account_balance = models.DecimalField(max_digits=18, decimal_places=2)
      last_deposit = models.DecimalField(max_digits=10, decimal_places=2)
      interest_rate = models.DecimalField(max_digits=3, decimal_places=0)
      date_created = models.DateField(auto_now_add=True)

      def __str__(self):
          return self.account_number



class Transaction(models.Model):
      owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, 
      null=True)
      from_account = models.CharField(max_length=13)
      to_account = models.CharField(max_length=13)
      amount = models.DecimalField(max_digits=10, decimal_places=2)
      date_created = models.DateField(auto_now_add=True)

      def __str__(self):
        return str(self.amount)


    @login_required(login_url='../../accounts/login/')
def send(request):
    if request.method == 'POST':
        form = forms.TransactionForm(request.POST)
        if form.is_valid():
            sender = Account.objects.get(account_number=request.POST.get('from_account'))
            if sender.account_balance > decimal.Decimal(request.POST.get('amount')):

                trans =  form.save()
                trans.owner = request.user
                trans.save()

                # debit the sender account
                sender.account_balance -= decimal.Decimal(request.POST.get('amount'))
                sender.save()

                #credit the receiver account
                receiver = Account.objects.get(account_number=request.POST.get('to_account'))
                receiver.account_balance += decimal.Decimal(request.POST.get('amount'))
                receiver.save()

                return HttpResponseRedirect(reverse_lazy('customers:history'))
            # else:
            #     return 
    else:
        form = forms.TransactionForm()
        return render(request, "customers/send_money.html", {'form': form})

但是我的问题是当管理员代表用户转账时如何做同样的事情。如何从账户表中的发件人账户余额中扣除金额,然后将金额添加到收款人的账户余额中。

如果有人可以帮助我,我将不胜感激。

标签: pythondjango-2.0

解决方案


一个“肮脏的黑客”解决方法,但不是很好,因为您在更改它时不知道用户是存款还是取款,它位于您应用程序的 admin.py 文件中。例子:

from django.contrib import admin
from .models import Transaction, Account

@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
    list_display = ('owner', 'account_number', 'account_balance')
    list_filter = ('account_balance', 'account_type', 'date_created')
    list_editable = ['account_balance']

完成上述操作后,account_balance将可以从管理面板进行编辑。不利的一面是,如果用户有 100 美元,而管理员想要取出 50 美元,但用户只是试图同时花费 60 美元。

或者更糟糕的是:如果你加载管理面板并且用户有 100,当你的页面没有刷新时,他们存入 5000。然后你决定从你看到的值中拿走 50,因为你没有刷新它......现在他们损失了 4950。

有一些方法可以让您自己的管理面板功能可以实时更新。看看如何在那里做到这一点。


推荐阅读