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 :) .

পাইথনে os মডিউল

কি কাজে লাগে :        os মডিউল ব্যবহার করে আমরা ডিরেক্টরি পরিবর্তন করতে পারি , ডিরেক্টরি তে রাখা ফাইলের নাম পরিবর্তন করতে পারি , কোন প্লাটফর্ম ব্যবহার করছি তা জানতে পারি।  শুধু মাত্র ২-৩ লাইন কোড লিখে হাজার হাজার ফোল্ডার বানাতে পারি।  এমনকি আমার প্রিয় গানটা ও প্লে করতে পারি। তাহলে দেখে নেই কিভাবে করবো। ওসি মডিউলে নিয়ে কাজ করতে গেলে আগে মডিউল  ইম্পোর্ট করে নিতে হবে এভাবে , import os আমি এখন কোন ডিরেক্টরি তে আছি আগে এইটা দেখি। os.getcwd() ডিরেক্টরি পরিবর্তন করতে হলে , os.chdir('path_name')  path_name = কোন পথ এ যেতে চান os.name দিয়ে কোন প্লাটফর্মে আছেন তার তথ্য পাবেন। ভ্যালু গুলা এভাবে দেখতে পাবেন   ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. os.uname() দিলে সিস্টেম ডিপেন্ডেন্ট সকল ইনফরমেশন দেখাবে। ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’ এগুলা কি তা একটু গুগল করে গুগলের সাথে বন্ধুত্ব বাড়াতে পারেন 😋. os.mkdir("folder_name") এই কমান্ড দিয়ে একটি মাত্র ফোল্ডার বানাতে পারবেন।  ফোল্ডারটি তৈরি হবে যে ডিরেক্টরি তে আপনি...

Sales Target & Sales Commission

Definition of Sales Target: A sales target is a sales tool that enables you to easily measure and estimate your opportunity contribution to your sales goal. Types Of Sales Target: Sales targets by product Sales targets by market segment Sales targets by region Sales targets by profit Sales Target Strategies: keep existing customers (e.g. a customer rewards program) attract new customers (e.g. marketing and advertising) sell more to existing customers (e.g. up-sell). A realistic sales target is often based on a solid marketing strategy.  You can help your sales staff achieve their targets by generating qualified leads and brand awareness from your marketing activities. Sales Target Allocation: Group wise target allocation Individual target allocation Sales Person Contribution: If more than one sales persons are working together on an order, then contribution (%) should be set for each Sales Person. Total % Contribution fo...