আজকে আমরা আমাদের accounts মডেল থেকে ফরম বানাবো। এখন আমাদের কিন্তু টোটাল ৩ টা মডেল আছে খেয়াল করছো কিনা। সেটা হলো বিল্ট ইন ইউজার মডেল, তারপর ইউজার এর ব্যাংক একাউন্ট মডেল, ইউজার এর অ্যাড্রেস মডেল। এখন আমরা চাই যে ইউজার ফরম ফিল আপ করবে একটা কিন্তু ডাটা সেভ হয়ে যাবে তিন টা মডেল এই। সেটার জন্যে আমরা একটা রেজিস্ট্রেশন ফরম বানাবো সেখানে django এর বিল্ট ইন usercreationform কে ইনহেরিট করে নিবো। সেখানে user মডেল, accounts মডেল, অ্যাড্রেস মডেল এর ফিল্ড গুলা নিয়ে আসবো। এখন ফিল্ড আনা শেষ কিন্তু আমরা চাই ইউজার একটা ফরম এর সাবমিট এ ক্লিক করলে তিন টা ডাটা base এই যেনো ডাটা সেভ হয় আর ডাটা ডাটাবেজ এ সেভ করার জন্যে একটা ফাংশন ইউজ করতাম আমরা নাম save এই সেভ ফাংশন কে আমরা মডিফাই করে এমন ভাবে লিখবো যেনো ইউজার ফরম সাবমিট করার সাথে সাথেই বাকি তিনটা মডেল এর ডাটা ও সেভ হয়ে যায়।
accounts/forms.py
class UserRegistrationForm(UserCreationForm):
birth_date = forms.DateField(widget=forms.DateInput(attrs={'type':'date'}))
gender = forms.ChoiceField(choices=GENDER_TYPE)
account_type = forms.ChoiceField(choices=ACCOUNT_TYPE)
street_address = forms.CharField(max_length=100)
city = forms.CharField(max_length= 100)
postal_code = forms.IntegerField()
country = forms.CharField(max_length=100)
class Meta:
model = User
fields = ['username', 'password1', 'password2', 'first_name', 'last_name', 'email', 'account_type', 'birth_date','gender', 'postal_code', 'city','country', 'street_address']
এখানে খেয়াল করে দেখো যে তিনটা মডেল এর ডাটা ই কিন্তু আছে এখানে
এখন save ফাংশন টা লিখবো , সেখানে আগে আমরা user মডেল এর ডাটা সেভ করবো। এরপর ইউজার যে ফরম টা সাবমিট করবে সেখানে তার একাউন্ট ইনফরমেশনের সাথে অ্যাড্রেস টাও থাকবে সেই ডাটা গুলা পাওয়ার জন্যে আমরা cleaned_data এর হেল্প নিবো তারপর সেখান থেকে ডাটা গুলা নিচের মত করে বের করে আনবো।
class UserRegistrationForm(UserCreationForm):
birth_date = forms.DateField(widget=forms.DateInput(attrs={'type':'date'}))
gender = forms.ChoiceField(choices=GENDER_TYPE)
account_type = forms.ChoiceField(choices=ACCOUNT_TYPE)
street_address = forms.CharField(max_length=100)
city = forms.CharField(max_length= 100)
postal_code = forms.IntegerField()
country = forms.CharField(max_length=100)
class Meta:
model = User
fields = ['username', 'password1', 'password2', 'first_name', 'last_name', 'email', 'account_type', 'birth_date','gender', 'postal_code', 'city','country', 'street_address']
# form.save()
def save(self, commit=True):
our_user = super().save(commit=False) # ami database e data save korbo na ekhn
if commit == True:
our_user.save() # user model e data save korlam
account_type = self.cleaned_data.get('account_type')
gender = self.cleaned_data.get('gender')
postal_code = self.cleaned_data.get('postal_code')
country = self.cleaned_data.get('country')
birth_date = self.cleaned_data.get('birth_date')
city = self.cleaned_data.get('city')
street_address = self.cleaned_data.get('street_address')
এখন কিন্তু আমাদের কাছে ইউজার এর অ্যাকাউন্ট, অ্যাড্রেস এর সব ডাটা আছে তাইলে জাস্ট এখন ডাটাবেজ এ ডাটা গুলা সেভ করতে হবে। সেটার জন্যে
model_name.objects.create() এই ফাংশন এর হেল্প নিবো আমরা তারপর কীওয়ার্ড আর্গুমেন্ট দিয়ে মডেল গুলা তে ডাটা বসাবো নিচের মত করে। এখানে তুমি ব্যাংক একাউন্ট যে নম্বর টা আছে সেটার আগে 100000 অ্যাড করে দিতে পারো তাইলে real ব্যাংক অ্যাকাউন্ট এর নম্বর মনে হবে সেটা।
from django.contrib.auth.forms import UserCreationForm
from django import forms
from .constants import ACCOUNT_TYPE, GENDER_TYPE
from django.contrib.auth.models import User
from .models import UserBankAccount, UserAddress
class UserRegistrationForm(UserCreationForm):
birth_date = forms.DateField(widget=forms.DateInput(attrs={'type':'date'}))
gender = forms.ChoiceField(choices=GENDER_TYPE)
account_type = forms.ChoiceField(choices=ACCOUNT_TYPE)
street_address = forms.CharField(max_length=100)
city = forms.CharField(max_length= 100)
postal_code = forms.IntegerField()
country = forms.CharField(max_length=100)
class Meta:
model = User
fields = ['username', 'password1', 'password2', 'first_name', 'last_name', 'email', 'account_type', 'birth_date','gender', 'postal_code', 'city','country', 'street_address']
# form.save()
def save(self, commit=True):
our_user = super().save(commit=False) # ami database e data save korbo na ekhn
if commit == True:
our_user.save() # user model e data save korlam
account_type = self.cleaned_data.get('account_type')
gender = self.cleaned_data.get('gender')
postal_code = self.cleaned_data.get('postal_code')
country = self.cleaned_data.get('country')
birth_date = self.cleaned_data.get('birth_date')
city = self.cleaned_data.get('city')
street_address = self.cleaned_data.get('street_address')
UserAddress.objects.create(
user = our_user,
postal_code = postal_code,
country = country,
city = city,
street_address = street_address
)
UserBankAccount.objects.create(
user = our_user,
account_type = account_type,
gender = gender,
birth_date =birth_date,
account_no = 100000+ our_user.id
)
return our_user