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
Post a Comment