আজকে আমরা deposit ভিউ নিয়ে কাজ করবো। সেজন্যে আমরা আমাদের TransactionCreateMixin ভিউ কে ইনহেরিট করে নিবো। সেখানে
form_class এ ফরম এর নাম দিবো
title এ Deposit Form দিবো যেটা কনটেক্সট হিসেবে আমাদের frontend এ চলে যাবে।
এখন এটা যে একটা ডিপোজিট ফরম সেটা ইউজার জাস্ট টাইটেল দেখে বুঝবে কিন্তু backend এ আমরা কিভাবে বুঝবো যে এটা ডিপোজিট ফরম?? সেজন্যে get_initial ফাংশন ইউজ করবো যেটা দিয়ে ফরম এর মধ্যে ইনিশিয়াল ভাবে ভ্যালু সেট করে দেওয়া যায়। আমরা transaction_type সেট করে দিবো ডিপোজিট নাম দিয়ে।
এখন ফাংশন based ভিউ এ যেমন form.is_valid হইলে কাজ করতাম তেমনি ক্লাস বেজড ভিউ এ form_valid এই ফাংশন এর মধ্যেই আমরা ফরম থেকে পাওয়া ডাটা নিয়ে কাজ করতে পারবো। আমরা ফরম থেকে amount ফিল্ড কে গেট করে আনবো এরপর ইউজার account কে নিবো তারপর ডিপোজিট amount টা ইউজার এর ব্যালান্স এর সাথে অ্যাড করে দিবো এবং ইউজার এর bank account কে সেভ করে ফেলবো আর messages ফ্রেমওয়ার্ক দিয়ে ইউজার কে মেসেজ দিবো যে তার ডিপোজিট সফল হয়েছে।
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views.generic import CreateView, ListView
from transactions.constants import DEPOSIT, WITHDRAWAL,LOAN, LOAN_PAID
from transactions.forms import (
DepositForm,
WithdrawForm,
LoanRequestForm,
)
from transactions.models import Transaction
class TransactionCreateMixin(LoginRequiredMixin, CreateView):
template_name = 'transactions/transaction_form.html'
model = Transaction
title = ''
success_url = reverse_lazy('transaction_report')
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({
'account': self.request.user.account
})
return kwargs
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) # template e context data pass kora
context.update({
'title': self.title
})
return context
class DepositMoneyView(TransactionCreateMixin):
form_class = DepositForm
title = 'Deposit Form'
def get_initial(self):
initial = {'transaction_type': DEPOSIT}
return initial
def form_valid(self, form):
amount = form.cleaned_data.get('amount')
account = self.request.user.account
account.balance += amount # amount = 200, tar ager balance = 0 taka new balance = 0+200 = 200
account.save(
update_fields=[
'balance'
]
)
messages.success(
self.request,
f'{"{:,.2f}".format(float(amount))}$ was deposited to your account successfully'
)
return super().form_valid(form)