Skip to main content

One-To-One লিংক ব্যবহার করে কিভাবে Django ডিফল্ট User মডেলকে এক্সটেন্ড করতে হয়?

Django User মডেলকে ব্যবহার করে কয়েক ভাবে ইউসার মডেল এর ফিল্ড বাড়ানো যায় ।  One-To-One লিংক তার মধ্যে একটা।  আমি ম্যাক্সিমাম সময় এই পদ্ধতি এপলাই করে থাকি।  এজন্য আমাদের একটা নতুন মডেল বানাতে হবে এক্সট্রা ফিল্ড গুলা অ্যাড করার জন্য যেগুলা ইউসার মডেল এর সাথে সম্পর্কিত। 

Profile নামে  একটা মডেল লিখি যেখানে আমরা ইউসার এর birthdate,  এবং address অ্যাড করবো।

models.py 

from django.db import models
from dajngo.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    birth_date = models.DateField(null=True, blank=True)

    address = models.TextField(max_length=500, blank=True)

 আমরা এখন কিছু সিগন্যাল অ্যাড করবো যাতে আমরা যখন কোনো ইউসার অ্যাড/আপডেট করবো তখন যেন আমাদের Profile মডেলটা ও অটোমেটিক অ্যাড/আপডেট হয়ে যায় ।

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    address  = models.TextField(max_length=500, blank=True)
    birth_date = models.DateField(null=True, blank=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

 আমি User  মডেল এর সাথে post_save নামে একটা signal , create_user_profile এবং save_user_profile মেথডে @receive decorator এর মাধ্যমে অ্যাড করেছি যার ফলে ইউসার create এর সময় যখন সেভ মেথড কল হবে তখন প্রোফাইল create হয়ে যাবে।

froms.py

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = '__all__'

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('url', 'location', 'company')

views.py

@login_required
@transaction.atomic
def update_profile(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=request.user)
        profile_form = ProfileForm(request.POST, instance=request.user.profile)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, _('Your profile was successfully updated!'))
            return redirect('settings:profile')
        else:
            messages.error(request, _('Please correct the error below.'))
    else:
        user_form = UserForm(instance=request.user)
        profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'profiles/profile.html', {
        'user_form': user_form,
        'profile_form': profile_form
    })

profile.html

<form method="post">
  {% csrf_token %}
  {{ user_form.as_p }}
  {{ profile_form.as_p }}
  <button type="submit">Save changes</button>
</form>

আসলে আমরা সিগন্যাল ব্যবহার না করে ও জিনিস টা করতে পারি। সেক্ষেত্রে আমাদেরকে ইউসার মডেলের ইনস্ট্যান্স ধরে কুয়েরি করে ম্যানুয়ালি ডাটা টা  প্রোফাইল মডেল এ সেভ করতে হতো।

বুঝতে সমস্যা হলে জানাতে পারেন। নতুন লিখছি বলে ভাষাগত সম্যসার জন্য ক্ষমা প্রাথী। 

Comments

Popular posts from this blog

How to set auto save in Sublime text editor

1. Press Ctrl+Shift+P 2 Package install/install package 3.Search autosave 4. Click to install 5. Go to Preference -> Package setting -> Auto Save -> Settings User 6. Paste the code   // Auto save default setting { "auto_save_on_modified": true, "auto_save_delay_in_seconds": 1, "auto_save_all_file": true, "auto_save_current_file": "", "auto_save_backup": false, "auto_save_backup_suffix": "autosave" } 7. Save the file, close the file and finally done :) .

Constructor and Destructor in Python

পাইথন এ ডিফল্ট কিছু  মেথড আছে  যাদেরকে ম্যাজিক মেথড বলা হয়। এই  মেথড গুলা __ মেথড নাম __ দিয়ে লেখা হয় .( আন্ডার স্কোর আন্ডার স্কোর একসাথে ডান্ডার ও বলা যায় ) __init__(): এটাকে  কন্সট্রাক্টর বলা হয়।  কাজ কি ? কাজ হলো যখন কোনো ক্লাস এর ইনস্ট্যান্স create  করা হয় তখন এই মেথড নিজে থেকে কল হয়।  যেমন আমার যদি একটা ক্যাট  ক্লাস নেই। class Cat : def __init__ ( self , legs , colour ): self . legs = legs self . color = color def get_name(self, name): return self.name = name fido = Cat ( 4 , "brown" ) spot = Cat ( 3 , "yellow" ) এই  ক্লাস এ যদি আমরা ক্যাট এর নাম পেতে  চাই তাহলে আমাদের Cat ().get_name ("Mini") কল করতে হবে।  কিন্তু লেগ্স এন্ড কালার এর জন্য কিন্তু Cat ().get_name ("Mini") কল করা লাগসে না।  আমি যখন এ  Cat ( 4 , "brown" )      initializeকরছি  তখনই   __init__   কল হইয়া গেসে । সাধারণত কোনো ক্লাস কল করার সাথে সাথে যদি কোনো ভ্যালু এসাইন করতে চাই তাহলে  __init__ব্যবহার   করা হয়