المشكلة: لا يمكن تغيير User لاحقًا بسهولة
Django يأتي بنموذج User جاهز (اسم، بريد، كلمة مرور). المشكلة: لو بدأت
مشروعك بـ User الافتراضي، ثم احتجت لاحقًا حقولًا إضافية (رقم هاتف، صورة
شخصية) أو تسجيل دخول بالبريد بدل اسم المستخدم — لا يمكن تبديل النموذج
بمشروع فيه بيانات حقيقية بدون ترحيل قاعدة بيانات معقّد جدًا وخطير.
القاعدة الذهبية: أنشئ نموذج مستخدم مخصّص بأول migration بمشروعك، حتى لو لم تحتج حقولًا إضافية الآن. التكلفة صفر اليوم، ومكلفة جدًا لاحقًا.
الخطوة 1: إنشاء تطبيق accounts
python manage.py startapp accounts
الخطوة 2: تعريف النموذج المخصّص
# accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
# كل حقول User الافتراضي موجودة تلقائيًا (username, email, password...)
# أضف حقولك الخاصة هنا:
phone = models.CharField(max_length=20, blank=True)
bio = models.TextField(max_length=500, blank=True)
def __str__(self):
return self.username
AbstractUser يمنحك كل ميزات User الجاهزة (تشفير كلمة المرور، الصلاحيات،
تكامل مع django.contrib.auth) مع حرية إضافة حقول جديدة.
الخطوة 3: إخبار Django باستخدامه
# settings.py
AUTH_USER_MODEL = "accounts.CustomUser"
هذا السطر يجب أن يُضاف قبل أول migrate على المشروع — إضافته لاحقًا
على قاعدة بيانات فيها جداول أخرى تشير لـ User القديم يسبب تعارضات صعبة
الحل.
الخطوة 4: (اختياري) نماذج إدارية مخصّصة
# accounts/forms.py
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUser
fields = UserCreationForm.Meta.fields + ("email",)
class CustomUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = CustomUser
# accounts/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser
from .forms import CustomUserCreationForm, CustomUserChangeForm
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
admin.site.register(CustomUser, CustomUserAdmin)
الخطوة 5: الترحيل الأول
python manage.py makemigrations accounts
python manage.py migrate
الوصول للمستخدم الحالي بأي مكان بالكود
from django.conf import settings
# داخل نموذج آخر يشير للمستخدم:
class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
# ✅ صحيح: يشير لأي نموذج مستخدم معرَّف بـ AUTH_USER_MODEL
# داخل view:
request.user.phone # الوصول للحقل المخصّص مباشرة
جدول سريع
| السطر/الكلمة | الغرض |
|---|---|
AbstractUser | صنف أساس يمنحك كل ميزات User مع إمكانية الإضافة |
AUTH_USER_MODEL | إعداد يخبر Django أي نموذج يُستخدم كمستخدم النظام |
settings.AUTH_USER_MODEL | الطريقة الصحيحة للإشارة للمستخدم من نماذج أخرى (لا User مباشرة) |
أخطاء شائعة
- تأجيل إنشاء نموذج مستخدم مخصّص لمرحلة متأخرة من المشروع — أكبر خطأ شائع بمشاريع Django الحقيقية، يصعب تصحيحه لاحقًا بلا فقدان بيانات.
- استخدام
from django.contrib.auth.models import Userمباشرة بنماذج أخرى بدلsettings.AUTH_USER_MODEL— يكسر المشروع فور تفعيل نموذج مخصّص لاحقًا. - نسيان
AUTH_USER_MODELبالإعدادات قبل أولmigrate— يسبب تعارض جداول يصعب حله.
🎯 التالي: Django REST Framework — مستوى متقدم.