Step 1: Virtual Environment & Packages Install
টার্মিনালে রান করো:
python -m venv venv
venv\Scripts\activate # Windows এ
# অথবা source venv/bin/activate # Mac/Linux
pip install django djangorestframework django-cors-headers rest-framework-simplejwt pillow stripeকী হচ্ছে এখানে?
venvএকটা আলাদা environment বানায় যাতে তোমার প্রজেক্টের packages অন্য প্রজেক্টের সাথে মিশে না যায়।- Activate করলে তুমি এই environment এর ভিতরে কাজ করবে।
- ফলাফল: Django, DRF (API এর জন্য), CORS (Frontend থেকে call করার জন্য), SimpleJWT (JWT token এর জন্য), Pillow (ImageField এর জন্য), Stripe (পরে payment এর জন্য) install হয়ে যাবে।
Step 2: Django Project & App Create
django-admin startproject campaign_project
cd campaign_project
python manage.py startapp campaign_appকী হচ্ছে?
campaign_projectহলো তোমার মেইন প্রজেক্ট ফোল্ডার।campaign_appহলো তোমার অ্যাপ – এখানে সব models, views ইত্যাদি থাকবে।
ফলাফল: প্রজেক্ট রেডি। এখন আমরা campaign_app এ কাজ করব।
Step 3: Folder Structure তৈরি করা (API গুলো আলাদা রাখার জন্য)
campaign_app ফোল্ডারে যাও এবং বানাও:
mkdir campaign_app/api
touch campaign_app/api/__init__.py
touch campaign_app/api/serializers.py
touch campaign_app/api/views.py
touch campaign_app/api/urls.pyকেন করছি?
তুমি বলেছিলে serializers ও views api/ ফোল্ডারে রাখতে। এটা clean code এর জন্য ভালো।
ফলাফল: Structure clean হয়ে গেল।
Step 4: models.py – Custom User Model বানানো (সবচেয়ে গুরুত্বপূর্ণ অংশ!)
campaign_app/models.py এ পুরোটা পেস্ট করো:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.utils import timezone
import uuid
# ✅ 1. Custom User Manager
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
"""সাধারণ user তৈরি করে"""
if not email:
raise ValueError("Email দিতে হবে!")
email = self.normalize_email(email) # lowercase করে
user = self.model(email=email, **extra_fields)
user.set_password(password) # password hash করে
user.save(using=self._db)
return user
def create_superuser(self, email, password=None, **extra_fields):
"""Superuser তৈরি করে (admin panel এর জন্য)"""
extra_fields.setdefault('is_super_admin', True)
extra_fields.setdefault('is_active', True)
extra_fields.setdefault('is_admin', True)
return self.create_user(email, password, **extra_fields)
# ✅ 2. Main Custom User Model
class User(AbstractBaseUser, PermissionsMixin):
# Basic Info
email = models.EmailField(unique=True) # এটাই login এর username হবে
business_owner_name = models.CharField(max_length=255)
business_name = models.CharField(max_length=255)
industry_type = models.CharField(max_length=100, blank=True)
mobile_number = models.CharField(max_length=20, blank=True)
# Address
address = models.TextField(blank=True)
address_line_2 = models.TextField(blank=True, null=True)
city = models.CharField(max_length=100, blank=True)
state = models.CharField(max_length=100, blank=True)
zipcode = models.CharField(max_length=20, blank=True)
# Media
profile_photo = models.ImageField(upload_to='profile_photos/', blank=True, null=True)
# Status flags
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_super_admin = models.BooleanField(default=False)
# Payment related
stripe_customer_id = models.CharField(max_length=255, blank=True)
# Timestamps
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# ✅ Manager attach করা
objects = UserManager()
# ✅ কোন field দিয়ে login হবে? → email
USERNAME_FIELD = 'email'
# ✅ createsuperuser কমান্ড চালালে কোন কোন field চাইবে?
REQUIRED_FIELDS = ['business_owner_name', 'business_name']
def __str__(self):
return self.email
# ✅ 3. Password Reset Token Model
class PasswordResetToken(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
token = models.UUIDField(default=uuid.uuid4, unique=True)
created_at = models.DateTimeField(default=timezone.now)
# ✅ 4. Invitation Model (Team member invite)
class Invitation(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='invitations')
email = models.EmailField()
token = models.UUIDField(default=uuid.uuid4, unique=True)
is_accepted = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)গভীর ব্যাখ্যা (যা তুমি বিশেষভাবে জানতে চেয়েছ):
- AbstractBaseUser কেন ব্যবহার করছি?
Django এর default User model এusernamefield থাকে। কিন্তু আমরা চাই email দিয়ে login করতে। তাইAbstractBaseUserinherit করে নিজের মতো model বানাচ্ছি। এটা করে আমরা password hashing, is_active ইত্যাদি built-in features পাই, কিন্তু username বাদ দিয়ে email কে primary করতে পারি। - PermissionsMixin কেন?
এটা থেকেis_superuser, groups, permissions ইত্যাদি আসে। না দিলে admin panel এ permission manage করা যাবে না। - USERNAME_FIELD = ’email’ কী করে?
এটা বলে যে login করার সময় email দিয়ে authenticate হবে (username এর বদলে)।authenticate(email=..., password=...)এভাবে কাজ করবে। - REQUIRED_FIELDS কী? কেন দরকার?
এটা শুধুpython manage.py createsuperuserকমান্ডের জন্য। এই লিস্টে যে fields দিবে, superuser বানানোর সময় terminal এ সেগুলো চাইবে। - আমি দিয়েছি
['business_owner_name', 'business_name']→ superuser বানালে email + password + এই দুটো চাইবে। - গুরুত্বপূর্ণ: এখানে
emailবাpasswordদিতে হবে না – এগুলো automatically চাওয়া হয়। - UserManager কেন বানালাম?
Django এর default managerusernameexpect করে। কিন্তু আমাদেরemailদিয়ে user তৈরি করতে হবে। তাই custom manager বানিয়েcreate_userওcreate_superuseroverride করলাম। create_user: সাধারণ registration এ ব্যবহার হবে।create_superuser: admin superuser বানানোর জন্য (is_super_admin = True করে)।normalize_email()→ email lowercase করে duplicate avoid করে।set_password()→ password hash করে save করে (security এর জন্য)।- Registration এ কোন fields পাবে?
Serializer এ আমরা decide করব, কিন্তু model এ যা আছে:
Required (blank=False): email, business_owner_name, business_name, password (manager এ handle করে)
Optional: industry_type, mobile_number, address ইত্যাদি, profile_photo - Superuser বানালে কী হবে?
python manage.py createsuperuserচালালে: - Email চাইবে (USERNAME_FIELD এর জন্য)
- Password চাইবে
- business_owner_name ও business_name চাইবে (REQUIRED_FIELDS এর জন্য)
- User টা is_active=True, is_super_admin=True হয়ে তৈরি হবে → admin panel এ full access পাবে।
Step 5: settings.py Configuration
campaign_project/settings.py এ যোগ/চেঞ্জ করো (গুরুত্বপূর্ণ অংশগুলো):
INSTALLED_APPS = [
# ... default গুলো
'rest_framework',
'rest_framework_simplejwt',
'corsheaders',
'campaign_app',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # সবার উপরে
# ... বাকি গুলো
]
AUTH_USER_MODEL = 'campaign_app.User' # ← এটা সবচেয়ে গুরুত্বপূর্ণ!
CORS_ALLOW_ALL_ORIGINS = True # Development এ
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
}
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'কেন এগুলো?
AUTH_USER_MODEL: Django কে বলছে আমাদের custom User ব্যবহার করতে। এটা না দিলে default User চলবে।- JWT & CORS: API এর জন্য দরকার।
- Media: profile photo upload এর জন্য।
Step 6: urls.py
campaign_project/urls.py:
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('campaign_app.api.urls')), # পরে API গুলো এখানে আসবে
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)Step 7: Migration & Test
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser # ← এখানে দেখবে email + password + business_owner_name + business_name চাইছে
python manage.py runserverফলাফল:
- Database এ custom User table তৈরি হবে।
- Superuser বানানো যাবে।
- Admin panel এ login করতে পারবে (http://127.0.0.1:8000/admin/)