আজকে আমরা একটা ইন্টারেস্টিং কাজ করবো সেটা হলো আগে আমরা নরমালি frontend অর্থাৎ html এর মধ্যেই ডিজাইন করতাম কিন্তু আজকে আমরা জানবো কিভাবে backend থেকেও ডিজাইন করা যেতে পারে।
এখন চিন্তা করে দেখো যে এই ডিজাইন কখন কাজ করবো? এখন এটা চিন্তা করা লাগতেছে কারণ ডিজাইন টা backend থেকে আসবে সেজন্যে। আমরা চাই যখনি একজন ইউজার ফরম দেখবে ডিজাইন যেনো তখনি অ্যাড হয়ে যায় এবং উনার যেনো সেটা বুঝতে না পারে। সেটার জন্যে আমাদের constructor ইউজ করতে হবে অর্থাৎ যখনি ফরম ক্লাস এর একটা অবজেক্ট তৈরি হবে ডিজাইন যেনো তখনি অ্যাড হয়।
Constructor হিসেবে আমরা __init__ মেথড কে ইউজ করবো। এখন ফরম এর মধ্যে বিল্ট ইন ভাবে তো কিছু লেখা থাকবেই আমরা সেটা কে ইনহেরিট করে তারপর অভার রাইট করবো। যেহেতু আমাদেরকে সব গুলা ইনপুট বক্স এ ডিজাইন করতে হবে সেজন্যে আমরা লুপ চালিয়ে সব গুলা ফিল্ড এই ক্লাস অ্যাড করবো।
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
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].widget.attrs.update({
'class' : (
'appearance-none block w-full bg-gray-200 '
'text-gray-700 border border-gray-200 rounded '
'py-3 px-4 leading-tight focus:outline-none '
'focus:bg-white focus:border-gray-500'
)
})