আজকে আমরা আমাদের ইউজার প্রোফাইল আপডেট জন্যে কাজ করবো। আমরা রেজিস্ট্রেশন এ যে যে কাজ করছি সেই কাজ গুলায় আমাদের এখানে কপি পেস্ট করে ইউজার প্রোফাইল আপডেট এর কাজ করতে পারি। UserProfileUpdate নামে একটা ফরম তৈরি করলাম যেখানে modelform কে ইনহেরিট করে নিলাম। ইউজার আসলে তার পাসওয়ার্ড বাদ দিয়ে বাকি সব কিছু আপডেট করতে পারবে, পাসওয়ার্ড কেনো পারবে না কারণ হচ্ছে পাসওয়ার্ড আপডেট করার জন্যে আমাদেরকে আলাদা ফরম এর প্রয়োজন পড়বে যেটা আমরা আপাতত ইউজ করবো না।
class UserUpdateForm(forms.ModelForm):
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 = ['first_name', 'last_name', 'email']
এখন ফরম ডিজাইন করার জন্যে init constructor দিয়ে আমরা ডিজাইন করে ফেললাম এবং যেহেতু একজন ইউজার তার একাউন্ট আছে বলেই তার ডাটা আপডেট করতে পারবে সো ফরম টা যেনো তার আগের ডাটা দিয়ে ফিল আপ করা থাকে সেই ব্যবস্থা করতে হবে আমাদেরকে।
class UserUpdateForm(forms.ModelForm):
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 = ['first_name', 'last_name', 'email']
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'
)
})
সেজন্যে আমরা চেক করে দেখতেছি যে self.instance.account অর্থাৎ একাউন্ট অবজেক্ট আছে কিনা আবার self.instance.address অর্থাৎ ইউজার এর অ্যাড্রেস অবজেক্ট আছে কিনা, যদি থাকে তাইলে ফরম এর প্রতিটা ঘর ফিল আপ করে দিবো এভাবে
class UserUpdateForm(forms.ModelForm):
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 = ['first_name', 'last_name', 'email']
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'
)
})
# jodi user er account thake
if self.instance:
try:
user_account = self.instance.account
user_address = self.instance.address
except UserBankAccount.DoesNotExist:
user_account = None
user_address = None
if user_account:
self.fields['account_type'].initial = user_account.account_type
self.fields['gender'].initial = user_account.gender
self.fields['birth_date'].initial = user_account.birth_date
self.fields['street_address'].initial = user_address.street_address
self.fields['city'].initial = user_address.city
self.fields['postal_code'].initial = user_address.postal_code
self.fields['country'].initial = user_address.country
এখন আমরা একটা backup হিসেবে get or create নামে একটা ফাংশন ইউজ করবো যার কাজ হচ্ছে যদি কোনো ইউজার এর অ্যাকাউন্ট না থাকে তাইলে create করবে আর থাকলে সেটাকে বের করে আনবে। এর পর ইউজার আপডেট ফরম এ যা যা দিবে সেগুলা দিয়ে আমরা আমাদের ফরম এর মধ্যে বসিয়ে দিচ্ছি । খেয়াল করে দেখো আগে আমরা modelname.objects.create ইউজ করতাম, এখন কিন্তু সেটা করি নাই কারন এখন আমরা আপডেট ফরম এর ডাটা দিয়ে আমাদের ডাটাবেজ এর ডাটা আপডেট করবো।
class UserUpdateForm(forms.ModelForm):
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 = ['first_name', 'last_name', 'email']
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'
)
})
# jodi user er account thake
if self.instance:
try:
user_account = self.instance.account
user_address = self.instance.address
except UserBankAccount.DoesNotExist:
user_account = None
user_address = None
if user_account:
self.fields['account_type'].initial = user_account.account_type
self.fields['gender'].initial = user_account.gender
self.fields['birth_date'].initial = user_account.birth_date
self.fields['street_address'].initial = user_address.street_address
self.fields['city'].initial = user_address.city
self.fields['postal_code'].initial = user_address.postal_code
self.fields['country'].initial = user_address.country
def save(self, commit=True):
user = super().save(commit=False)
if commit:
user.save()
user_account, created = UserBankAccount.objects.get_or_create(user=user) # jodi account thake taile seta jabe user_account ar jodi account na thake taile create hobe ar seta created er moddhe jabe
user_address, created = UserAddress.objects.get_or_create(user=user)
user_account.account_type = self.cleaned_data['account_type']
user_account.gender = self.cleaned_data['gender']
user_account.birth_date = self.cleaned_data['birth_date']
user_account.save()
user_address.street_address = self.cleaned_data['street_address']
user_address.city = self.cleaned_data['city']
user_address.postal_code = self.cleaned_data['postal_code']
user_address.country = self.cleaned_data['country']
user_address.save()
return user