১৪.২ : ট্রানসাকশান ফর্ম তৈরী

আজকে আমরা transaction ফরম নিয়ে কাজ করবো অর্থাৎ যে transaction মডেল তৈরি করেছিলাম সেটার ফরম তৈরি করবো। সেজন্যে আমরা forms.py কে তৈরি করে নিবো। আমরা মডেল ফরম ইউজ করবো। এখন আমরা চাই যে একজন ইউজার যেনো transaction টাইপ টা দেখতে না পারে, আমরা সেটা backend থেকে বসিয়ে দিবো। সেজন্যে আমরা transaction type এর ফিল্ড কে hidden করে দিলাম আর সেই সাথে ইনপুট ফিল্ড টা disabled করে রাখলাম যাতে কেউ অ্যাকসেস করতে না পারে। তুমি বলতেই পারো ভাইয়া ফিল্ডস এর মধ্যে transaction_type টা না দিলেই তো হত,ইউজার দেখতে পেতো না। কিন্তু সেটা করলে ইউজার আসলে কোন টাইপ transaction করতেছে আমরা ধরতে পারতাম না। এখন যখনি একজন ইউজার কোনো transaction করবে তখনই তারা বালান্স আপডেট হয়ে যাবে এবং balance after transaction টা হবে বালান্সের সমান। ইউজার কে বের করে আনার জন্যে নিচের কাজ করবো।

কারণ বলি এই কাজ টা কেনো করলাম।

আমাদের টার্গেট এই ফরম টা কে ইনহেরিট করতে আমরা ইউজার কে ডিপোজিট করতে দিবো, উইথড্র করতে দিবো, লোন রিকোয়েস্ট এর ফরম দিবো। লাভ কি?? আমাদের একই কাজ বার বার করতে হবে না। কোনটা একই কাজ?? এইযে ব্যালান্স আপডেট করা, ব্যালান্স after transaction কে আপডেট করা এই কাজ গুলা।

এখন তোমার মনে একটা কোয়েশ্চন আসা উচিত যে , init method এর মধ্যে account কে pop কেনো করলাম?? কারণ টা হচ্ছে একজন logged ইন ইউজার ই কেবল মাত্র আমাদের ডিপোজিট,উইথড্র, লোন এর রিকোয়েস্ট করতে পারবে এখন তাকে বার বার প্রমাণ করতে হবে না যে সে logged ইন ইউজার। transactions/forms.py

from django import forms
from .models import Transaction
class TransactionForm(forms.ModelForm):
    class Meta:
        model = Transaction
        fields = [
            'amount',
            'transaction_type'
        ]

    def __init__(self, *args, **kwargs):
        self.user_account = kwargs.pop('account') # account value ke pop kore anlam
        super().__init__(*args, **kwargs)
        self.fields['transaction_type'].disabled = True # ei field disable thakbe
        self.fields['transaction_type'].widget = forms.HiddenInput() # user er theke hide kora thakbe

    def save(self, commit=True):
        self.instance.account = self.user_account
        self.instance.balance_after_transaction = self.account.balance
        return super().save()

Last updated