تخطَّ إلى المحتوى

🎸 شرح Django

نموذج المستخدم المخصّص (Custom User Model)

الدرس 25 من 30· ⏱ 2 دقائق قراءة

المشكلة: لا يمكن تغيير 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 — مستوى متقدم.

شرح نموذج المستخدم المخصّص (Custom User Model) — Django بالعربي
نموذج المستخدم المخصّص (Custom User Model)Django بالعربي · The Code Fix

📚 لمزيد من التعمّق في Django، راجِع التوثيق الرسمي لـ Django.

هل كان هذا الدرس مفيدًا؟