১৩.১১ : ইউজার প্রোফাইল আপডেট করা

আজকে আমরা আমাদের ইউজার প্রোফাইল আপডেট জন্যে কাজ করবো। আমরা রেজিস্ট্রেশন এ যে যে কাজ করছি সেই কাজ গুলায় আমাদের এখানে কপি পেস্ট করে ইউজার প্রোফাইল আপডেট এর কাজ করতে পারি। 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 অর্থাৎ ইউজার এর অ্যাড্রেস অবজেক্ট আছে কিনা, যদি থাকে তাইলে ফরম এর প্রতিটা ঘর ফিল আপ করে দিবো এভাবে

user_account = self.instance.account
user_address = self.instance.address
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
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

Last updated