Django স্বয়ংক্রিয়ভাবে প্রতিটি মডেলের জন্য কিছু ডিফল্ট পারমিশন প্রদান করে, যা হলো:
add– নতুন ডাটা যোগ করার অনুমতি।change– ডাটা পরিবর্তনের অনুমতি।delete– ডাটা মুছে ফেলার অনুমতি।view– ডাটা দেখার অনুমতি।
নিচে Django-তে Unfold Admin Panel এবং Django Guardian ব্যবহার করে ফিল্ড-ভিত্তিক পারমিশন সেটআপের সম্পূর্ণ বাংলা টিউটোরিয়াল দেওয়া হলো:
ধাপ ১: প্রজেক্ট সেটআপ ও প্যাকেজ ইন্সটল
১. ডিজাঙ্গো ও প্যাকেজ ইন্সটল করুন:
pip install django django-unfold django-guardian২. প্রজেক্ট ও অ্যাপ তৈরি করুন:
django-admin startproject myproject
cd myproject
python manage.py startapp myappধাপ ২: সেটিংস কনফিগারেশন
settings.py ফাইলে নিচের পরিবর্তনগুলো করুন:
# settings.py
INSTALLED_APPS = [
'unfold',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'guardian',
'myapp', # আপনার অ্যাপের নাম
]
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'guardian.backends.ObjectPermissionBackend',
)ধাপ ৩: মডেল তৈরি করুন
myapp/models.py এ একটি মডেল যোগ করুন:
from django.db import models
from django.contrib.auth.models import User
class Document(models.Model):
title = models.CharField(max_length=200, verbose_name="ডকুমেন্টের নাম")
content = models.TextField(verbose_name="কন্টেন্ট")
confidential = models.TextField(verbose_name="গোপন নোট") # রেস্ট্রিক্টেড ফিল্ড
owner = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
permissions = [
("view_confidential", "গোপন নোট দেখার অনুমতি"),
("change_confidential", "গোপন নোট এডিটের অনুমতি"),
]ধাপ ৪: অ্যাডমিন প্যানেল কাস্টমাইজ (Unfold + Guardian)
myapp/admin.py ফাইলটি এভাবে তৈরি করুন:
from unfold.admin import ModelAdmin
from django.contrib import admin
from guardian.admin import GuardedModelAdmin
from .models import Document
@admin.register(Document)
class DocumentAdmin(GuardedModelAdmin, ModelAdmin):
list_display = ['title', 'owner']
# ফিল্ড দেখার অনুমতি চেক
def get_fields(self, request, obj=None):
fields = super().get_fields(request, obj)
if not request.user.has_perm('myapp.view_confidential', obj):
fields = [f for f in fields if f != 'confidential']
return fields
# ফিল্ড এডিটের অনুমতি চেক
def get_readonly_fields(self, request, obj=None):
readonly = super().get_readonly_fields(request, obj)
if not request.user.has_perm('myapp.change_confidential', obj):
readonly += ('confidential',)
return readonly
# শুধু ইউজারের নিজের ডকুমেন্ট দেখাবে
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(owner=request.user)ধাপ ৫: মাইগ্রেশন ও সুপারইউজার তৈরি
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuserধাপ ৬: পারমিশন অ্যাসাইন (প্র্যাকটিক্যাল উদাহরণ)
১. ডিজাঙ্গো শেলে পারমিশন অ্যাসাইন:
python manage.py shell from django.contrib.auth.models import User
from myapp.models import Document
from guardian.shortcuts import assign_perm
user = User.objects.get(username='user1')
doc = Document.objects.get(id=1)
# পারমিশন দিন
assign_perm('myapp.view_confidential', user, doc)
assign_perm('myapp.change_confidential', user, doc)২. অ্যাডমিন প্যানেলে পারমিশন ম্যানেজ করুন:
- Unfold অ্যাডমিনে গিয়ে
Documentমডেলে যান - “Object permissions” ট্যাবে ক্লিক করে পারমিশন অ্যাসাইন করুন
ধাপ ৭: টেস্টিং
১. ভিউ পারমিশন টেস্ট:
- যে ইউজারের
view_confidentialপারমিশন নেই, সেconfidentialফিল্ড দেখতে পাবে না
২. এডিট পারমিশন টেস্ট:
- যে ইউজারের
change_confidentialপারমিশন নেই, সে ফিল্ডটি রিড-অনলি দেখবে
ট্রাবলশুটিং ও সুরক্ষা টিপস
১. বেকেন্ড ভ্যালিডেশন:
# views.py
if not request.user.has_perm('myapp.change_confidential', obj):
raise PermissionDenied("এই ফিল্ড এডিটের অনুমতি নেই!")২. টেমপ্লেটে চেক:
{% if user.has_perm 'myapp.view_confidential' %}
{{ object.confidential }}
{% endif %}চূড়ান্ত সেটআপ স্ক্রিনশট
(স্ক্রিনশট লিংক)
উপকারিতা
- অবজেক্ট-লেভেল কন্ট্রোল: প্রতিটি ডকুমেন্টের জন্য আলাদা পারমিশন
- মডার্ন UI: Unfold-এর সুন্দর ইন্টারফেস
- সিকিউরিটি: Django Guardian-এর শক্তিশালী পারমিশন সিস্টেম
এই টিউটোরিয়াল অনুসরণ করে আপনি Django-তে Unfold ও Guardian দিয়ে প্রফেশনাল লেভেলের ফিল্ড-ভিত্তিক পারমিশন সিস্টেম বাস্তবায়ন করতে পারবেন। কোনো সমস্যা হলে কমেন্টে জানান! 😊