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") এই কমান্ড দিয়ে একটি মাত্র ফোল্ডার বানাতে পারবেন।  ফোল্ডারটি তৈরি হবে যে ডিরেক্টরি তে আপনি...

কিভাবে Django তে চেঞ্জ পাসওয়ার্ড ভিউ Create করতে হয় ?

ইউসার প্রোফাইল থাকলে পাসওয়ার্ড চেঞ্জ এর অপশনের দরকার হয়।  Django তে বিল্ট ইন PasswordChangeForm ব্যবহার  করে খুব সহজে এই অপশন আনা যায়।  এজন্য  ফাঙ্কশন বেসড ভিউ ব্যবহার করা ভালো কারণ PasswordChangeForm , ModelForm কে ইনহেরিট করে না এবং ইউসার আর্গুমেন্ট কন্সট্রাক্টর হিসেবে নেয় . আমরা views.py এভাবে লিখতে পারি from django.contrib.auth import update_session_auth_hash from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import PasswordChangeForm from django.shortcuts import render, redirect @login_required def change_password(request):     if request.method == 'POST':         form = PasswordChangeForm(request.user, request.POST)         if form.is_valid():             user = form.save()             update_session_auth_hash(request, user)                     ...