توثيق المستخدمين وإدارة المستخدمين في Django

توثيق المستخدمين وإدارة المستخدمين في Django

إذا كنت تعمل على مشروع Django وتريد أن تفهم كيف تُدار عملية تسجيل الدخول والخروج، وكيف يتم إنشاء المستخدمين، والتحكم في الصلاحيات، وحماية الصفحات، فأنت في المكان الصحيح. هذا الموضوع من أهم المواضيع في Django، لأنه ببساطة هو البوابة التي يدخل منها المستخدمون إلى تطبيقك، وهو أيضًا الحارس الذي يقرر من يرى ماذا، ومن يستطيع أن يفعل ماذا.

في هذا المقال سنشرح Django Authentication and User Management بشكل عملي جدًا، خطوة بخطوة، وبأسلوب بسيط ومفهوم. لن نكتفي بالشرح النظري، بل سنبني معًا مثالًا حقيقيًا يحتوي على تسجيل الدخول، تسجيل الخروج، إنشاء حساب، صفحة بروفايل، حماية الصفحات، إدارة الصلاحيات، وتخصيص نموذج المستخدم عند الحاجة. وسأحاول أن أجعل الشرح قريبًا من الواقع، لأنك عندما تبني نظام دخول جيدًا فأنت لا تبني مجرد شاشة Login، بل تبني جزءًا حساسًا من أمان مشروعك وتجربة المستخدم فيه.

الجميل في Django أنه يأتيك بأدوات جاهزة وقوية جدًا في موضوع المصادقة Authentication وإدارة المستخدمين User Management. لكن رغم ذلك، كثير من المبتدئين يشعرون أن هذا الجزء معقد. السبب غالبًا ليس في Django نفسه، بل في كثرة المفاهيم المتداخلة: المستخدم، الجلسة Session، الصلاحيات Permissions، المجموعات Groups، النماذج Forms، وملفات الإعدادات Settings. لذلك سنفكك كل شيء بهدوء ونربط بينه بطريقة منظمة.


ما المقصود بالمصادقة Authentication وإدارة المستخدمين؟

المصادقة Authentication هي عملية التحقق من هوية المستخدم. بمعنى آخر: هل هذا الشخص بالفعل هو من يدّعي أنه هو؟ عندما يكتب البريد الإلكتروني أو اسم المستخدم وكلمة المرور، يقوم النظام بالتحقق من البيانات، وإذا كانت صحيحة يسمح له بالدخول.

أما إدارة المستخدمين User Management فهي أوسع من مجرد تسجيل الدخول. وهي تشمل:

  • إنشاء الحسابات

  • تعديل بيانات المستخدم

  • تسجيل الدخول والخروج

  • إعادة تعيين كلمة المرور

  • تغيير كلمة المرور

  • حماية الصفحات

  • تحديد الصلاحيات

  • التفريق بين المستخدم العادي والمدير

  • إدارة المجموعات والأدوار

في المشاريع الصغيرة قد تكتفي بتسجيل الدخول والخروج. لكن في المشاريع المتوسطة والكبيرة تصبح إدارة المستخدمين جزءًا أساسيًا من بنية التطبيق.


لماذا Django ممتاز في Authentication؟

Django لا يجعلك تبدأ من الصفر في كل مرة، بل يوفر نظامًا جاهزًا ومتكاملًا للمصادقة. وهذا النظام يشمل:

  • نموذج User الجاهز

  • نظام تسجيل الدخول والخروج

  • تشفير كلمات المرور

  • جلسات المستخدمين

  • الحماية من كثير من الأخطاء الشائعة

  • لوحة الإدارة Admin

  • الصلاحيات Groups وPermissions

  • نماذج جاهزة لتغيير كلمة المرور واستعادة كلمة المرور

هذا يعني أنك تستطيع بناء نظام دخول قوي بدون أن تكتب كل شيء يدويًا. ومع ذلك، من المهم جدًا أن تفهم كيف يعمل هذا النظام من الداخل حتى تستخدمه بشكل صحيح.


الفكرة العامة قبل البدء

سنفترض أننا نبني تطبيقًا بسيطًا فيه:

  • صفحة رئيسية

  • صفحة تسجيل دخول

  • صفحة تسجيل خروج

  • صفحة إنشاء حساب

  • صفحة بروفايل

  • صفحة محمية لا يدخلها إلا المستخدم المسجل

  • صفحة خاصة بالمدير فقط

وسنستخدم Django’s built-in authentication system بدل اختراع نظام خاص بنا من الصفر. وهذا هو الخيار الأفضل غالبًا، لأن بناء نظام مصادقة يدويًا من البداية قد يعرّض مشروعك لمشاكل أمنية خطيرة.


إنشاء مشروع Django جديد

إذا لم يكن لديك مشروع بعد، ابدأ بإنشاء مشروع وتطبيق جديد:

django-admin startproject authproject
cd authproject
python manage.py startapp accounts

بعد ذلك أضف التطبيق accounts إلى INSTALLED_APPS داخل settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accounts',
]

ما الذي يقدمه Django جاهزًا في auth؟

Django يحتوي بالفعل على نظام جاهز للمستخدمين، لذلك لديك نموذج User مدمج يمكن استخدامه مباشرة.

هذا النموذج يتضمن حقولًا مثل:

  • username

  • first_name

  • last_name

  • email

  • password

  • is_staff

  • is_superuser

  • is_active

  • date_joined

وفي أغلب الحالات، يمكنك استخدام هذا النموذج كما هو دون الحاجة إلى تخصيصه. لكن أحيانًا، عندما يكون مشروعك بحاجة إلى بريد إلكتروني كاسم دخول أساسي، أو تحتاج حقولًا إضافية مثل الهاتف أو الصورة، هنا قد تفكر في تخصيص نموذج المستخدم.


تسجيل الدخول Login في Django

Django يوفر View جاهزًا لتسجيل الدخول، وهذا شيء رائع جدًا. لا تحتاج إلى كتابة منطق التحقق من كلمة المرور بنفسك في معظم الحالات.

لننشئ ملف urls.py داخل التطبيق accounts:

from django.urls import path
from . import views

urlpatterns = [
    path('login/', views.user_login, name='login'),
]

ثم في views.py:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib import messages

def user_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            messages.success(request, 'Login successful.')
            return redirect('home')
        else:
            messages.error(request, 'Invalid username or password.')

    return render(request, 'accounts/login.html')

كيف يعمل هذا الكود؟

  • authenticate() يتحقق من صحة بيانات الدخول.

  • إذا كانت صحيحة، يرجع كائن user.

  • login() ينشئ جلسة Session للمستخدم.

  • بعدها يصبح المستخدم مسجلاً للدخول ويمكن للنظام تذكره بين الصفحات.

وهنا المهم أن تفهم أن Django لا يخزن كلمة المرور كنص صريح، بل يخزنها بشكل مشفر، وهذا جزء مهم من الأمان.


صفحة تسجيل الدخول login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
    <div class="row justify-content-center">
        <div class="col-md-5">
            <div class="card shadow-sm">
                <div class="card-body">
                    <h1 class="h4 mb-4">Login</h1>

                    {% if messages %}
                        {% for message in messages %}
                            <div class="alert alert-{{ message.tags }}">{{ message }}</div>
                        {% endfor %}
                    {% endif %}

                    <form method="post">
                        {% csrf_token %}
                        <div class="mb-3">
                            <label class="form-label">Username</label>
                            <input type="text" name="username" class="form-control">
                        </div>
                        <div class="mb-3">
                            <label class="form-label">Password</label>
                            <input type="password" name="password" class="form-control">
                        </div>
                        <button type="submit" class="btn btn-primary w-100">Login</button>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>

تسجيل الخروج Logout

الخروج أيضًا سهل جدًا في Django. نستخدم logout() من django.contrib.auth.

في views.py:

from django.contrib.auth import logout

def user_logout(request):
    logout(request)
    messages.success(request, 'You have been logged out.')
    return redirect('login')

ثم نضيف المسار:

from django.urls import path
from . import views

urlpatterns = [
    path('login/', views.user_login, name='login'),
    path('logout/', views.user_logout, name='logout'),
]

عندما يستدعي المستخدم هذا الرابط، يتم إنهاء الجلسة الحالية، ولا يعود النظام يعتبره مسجلاً للدخول.


إنشاء حساب جديد Register

في كثير من التطبيقات، لا يكفي أن يكون لديك تسجيل دخول فقط. تحتاج أيضًا إلى صفحة لإنشاء حساب جديد. Django لا يفرض عليك طريقة واحدة، لكن يمكنك بسهولة بناء Register Form.

لنبدأ بإنشاء forms.py داخل تطبيق accounts:

from django import forms
from django.contrib.auth.models import User

class RegisterForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    confirm_password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'email']

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get("password")
        confirm_password = cleaned_data.get("confirm_password")

        if password != confirm_password:
            raise forms.ValidationError("Passwords do not match.")

        return cleaned_data

ثم نكتب view التسجيل:

from django.contrib.auth.models import User
from .forms import RegisterForm

def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = User.objects.create_user(
                username=form.cleaned_data['username'],
                first_name=form.cleaned_data['first_name'],
                last_name=form.cleaned_data['last_name'],
                email=form.cleaned_data['email'],
                password=form.cleaned_data['password']
            )
            messages.success(request, 'Account created successfully.')
            return redirect('login')
    else:
        form = RegisterForm()

    return render(request, 'accounts/register.html', {'form': form})

صفحة التسجيل register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Register</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
    <div class="row justify-content-center">
        <div class="col-md-6">
            <div class="card shadow-sm">
                <div class="card-body">
                    <h1 class="h4 mb-4">Create Account</h1>
                    <form method="post">
                        {% csrf_token %}
                        {{ form.as_p }}
                        <button type="submit" class="btn btn-success w-100">Register</button>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>

لماذا نستخدم create_user بدل User() العادي؟

عندما تنشئ مستخدمًا جديدًا، يجب أن تكون كلمة المرور مشفرة بشكل صحيح.
ولهذا من الأفضل استخدام:

User.objects.create_user(...)

لأن هذا الأسلوب يقوم بتهيئة كلمة المرور بطريقة آمنة داخل Django.
أما إذا أنشأت المستخدم بطريقة عادية ثم خزنت كلمة المرور كما هي، فقد تقع في خطأ أمني خطير.


حماية الصفحات باستخدام login_required

من أهم الأشياء في إدارة المستخدمين أنك لا تريد أن يرى الزائر غير المسجل بعض الصفحات. هنا يأتي دور login_required.

مثال:

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def dashboard(request):
    return render(request, 'accounts/dashboard.html')

إذا حاول مستخدم غير مسجل الوصول إلى هذه الصفحة، فسيتم تحويله إلى صفحة تسجيل الدخول.


ضبط LOGIN_URL في settings.py

حتى يعرف Django أين يرسل الزائر غير المسجل، يمكنك تحديد:

LOGIN_URL = '/login/'

أو حسب المسار الذي تستخدمه في مشروعك.

هذا يساعد Django على توجيه المستخدم إلى صفحة الدخول المناسبة عندما تكون الصفحة محمية.


صفحة Dashboard للمستخدم المسجل

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dashboard</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
    <div class="card shadow-sm">
        <div class="card-body">
            <h1 class="h3">Welcome, {{ request.user.username }}</h1>
            <p>This page is visible only to authenticated users.</p>
            <a href="{% url 'logout' %}" class="btn btn-danger">Logout</a>
        </div>
    </div>
</div>
</body>
</html>

هذه الصفحة البسيطة تعطي المستخدم إحساسًا بأنه داخل حسابه بالفعل، ويمكنك لاحقًا توسيعها لتشمل الإحصائيات، الأنشطة، والبيانات الخاصة به.


فهم request.user

داخل Django، عندما يكون المستخدم مسجلًا للدخول، يمكنك الوصول إليه عبر:

request.user

هذا الكائن يمثل المستخدم الحالي. ويمكنك التحقق منه بسهولة، مثل:

if request.user.is_authenticated:
    ...

وهذه الخاصية مهمة جدًا لأنك قد تحتاج أحيانًا إلى إظهار عناصر معينة فقط للمستخدم المسجل، أو تنفيذ منطق مختلف بناءً على حالة تسجيل الدخول.


الفرق بين is_authenticated و is_anonymous

  • is_authenticated يعني أن المستخدم مسجل الدخول.

  • is_anonymous يعني أن المستخدم غير مسجل الدخول.

مثال:

if request.user.is_authenticated:
    print("User is logged in")
else:
    print("User is not logged in")

هذا من أكثر الأمور استخدامًا داخل القوالب والـ views.


تخصيص شكل قائمة التنقل حسب حالة المستخدم

داخل base.html يمكن أن تعرض أزرارًا مختلفة حسب ما إذا كان المستخدم مسجلًا أو لا:

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="container">
        <a class="navbar-brand" href="#">My Site</a>
        <div class="ms-auto">
            {% if request.user.is_authenticated %}
                <span class="text-white me-3">Hello, {{ request.user.username }}</span>
                <a href="{% url 'dashboard' %}" class="btn btn-outline-light btn-sm">Dashboard</a>
                <a href="{% url 'logout' %}" class="btn btn-danger btn-sm">Logout</a>
            {% else %}
                <a href="{% url 'login' %}" class="btn btn-outline-light btn-sm me-2">Login</a>
                <a href="{% url 'register' %}" class="btn btn-success btn-sm">Register</a>
            {% endif %}
        </div>
    </div>
</nav>

هذا النوع من التخصيص يعطي تجربة استخدام أنظف وأوضح.


إدارة الصلاحيات Permissions

الصلاحيات في Django تسمح لك بالتحكم في من يستطيع أن يرى أو يضيف أو يعدل أو يحذف. Django يوفر ثلاث صلاحيات أساسية غالبًا لكل نموذج:

  • add

  • change

  • delete

مثال على التحقق من صلاحية معينة:

if request.user.has_perm('books.add_book'):
    ...

وفي القوالب أيضًا يمكنك إظهار العناصر بحسب الصلاحية:

{% if request.user.has_perm('books.add_book') %}
    <a href="{% url 'book_create' %}" class="btn btn-primary">Add Book</a>
{% endif %}

هذا مهم جدًا في المشاريع التي فيها أكثر من نوع مستخدم.


المجموعات Groups في Django

Groups هي طريقة منظمة لتجميع مجموعة من الصلاحيات وإعطائها لفئة معينة من المستخدمين.
بدل أن تعطي كل صلاحية يدويًا لكل مستخدم، يمكنك إنشاء Group مثل:

  • Editors

  • Managers

  • Moderators

ثم تمنح كل Group صلاحيات محددة، وبعدها تضيف المستخدمين إليها.

هذا يوفر وقتًا كبيرًا، خصوصًا في المشاريع الكبيرة.


إنشاء Group من لوحة الإدارة

يمكنك الدخول إلى Django Admin ثم:

  • إنشاء Group جديدة

  • إضافة Permissions لها

  • ربط المستخدمين بها

بعد ذلك، كل مستخدم داخل تلك المجموعة يرث الصلاحيات المعطاة لها.


تخصيص نموذج المستخدم User Model

في بداية المشروع غالبًا يمكنك الاعتماد على نموذج Django الجاهز User.
لكن في بعض الحالات تحتاج إلى تخصيصه. مثال:

  • استخدام البريد الإلكتروني بدل username

  • إضافة رقم الهاتف

  • إضافة صورة بروفايل

  • إضافة تاريخ ميلاد

  • إضافة حقل role

في هذه الحالة من الأفضل أن تفعل ذلك في بداية المشروع، لأن تغيير نموذج المستخدم لاحقًا قد يكون معقدًا.


كيف نخصص User Model بطريقة صحيحة؟

الطريقة الشائعة هي إنشاء نموذج جديد يرث من AbstractUser أو AbstractBaseUser.
وللمبتدئين، AbstractUser أسهل وأقرب لنموذج Django الجاهز.

مثال:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=20, blank=True, null=True)
    profile_image = models.ImageField(upload_to='profiles/', blank=True, null=True)

ثم في settings.py:

AUTH_USER_MODEL = 'accounts.CustomUser'

هذا يطلب منك أن تخطط من البداية، لأن تغيير هذا الإعداد بعد تنفيذ migrations قد يسبب مشاكل إذا كان المشروع بدأ بالفعل.


لماذا يجب التفكير في Custom User Model مبكرًا؟

لأن Django يربط المستخدمين ببقية أجزاء المشروع.
إذا بدأت ثم قررت لاحقًا تغيير نموذج المستخدم، قد تواجه:

  • مشاكل في migrations

  • مشاكل في العلاقات

  • حاجة لإعادة بناء جزء من قاعدة البيانات

لذلك، إذا كنت تعرف من البداية أن مشروعك يحتاج إلى حقول إضافية، فمن الأفضل تخصيص المستخدم منذ البداية.


صفحة بروفايل Profile

من الأشياء الجميلة في تطبيقات المستخدمين إنشاء صفحة بروفايل، تعرض بيانات الحساب الحالية.

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def profile(request):
    return render(request, 'accounts/profile.html')

وفي القالب:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Profile</title>
</head>
<body>
    <h1>Profile</h1>
    <p>Username: {{ request.user.username }}</p>
    <p>Email: {{ request.user.email }}</p>
    <p>First Name: {{ request.user.first_name }}</p>
    <p>Last Name: {{ request.user.last_name }}</p>
</body>
</html>

يمكنك لاحقًا تطويرها لتشمل تعديل البروفايل ورفع الصورة وتغيير كلمة المرور.


تغيير كلمة المرور Change Password

Django يوفر أدوات جاهزة لإدارة كلمات المرور، وهذا شيء مهم جدًا.

مثال على استخدام PasswordChangeForm:

from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib import messages
from django.shortcuts import render, redirect

@login_required
def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(user=request.user, data=request.POST)
        if form.is_valid():
            user = form.save()
            update_session_auth_hash(request, user)
            messages.success(request, 'Password changed successfully.')
            return redirect('profile')
    else:
        form = PasswordChangeForm(user=request.user)

    return render(request, 'accounts/change_password.html', {'form': form})

لماذا نستخدم update_session_auth_hash؟

لأن تغيير كلمة المرور قد يؤدي إلى تسجيل الخروج تلقائيًا إذا لم يتم تحديث الجلسة.
وهذا السطر يحافظ على بقاء المستخدم داخل حسابه بعد تغيير كلمة المرور، وهي تجربة أفضل بكثير.


إعادة تعيين كلمة المرور Password Reset

Django أيضًا يقدم نظامًا قويًا جدًا لاسترجاع كلمة المرور عبر البريد الإلكتروني.
وهذا النظام مفيد للمواقع الحقيقية، لأنه من الطبيعي أن ينسى المستخدمون كلمات مرورهم.

يمكنك استخدام Views الجاهزة من Django، مثل:

  • PasswordResetView

  • PasswordResetDoneView

  • PasswordResetConfirmView

  • PasswordResetCompleteView

هذا الجزء يحتاج إعدادات بريد إلكتروني صحيحة، لكن الفكرة جميلة جدًا لأنه يوفر لك نظامًا شبه كامل دون كتابة كل شيء من الصفر.


مثال على استخدام Login Required مع Redirect

أحيانًا تريد أن تعيد المستخدم إلى الصفحة التي كان يريدها بعد تسجيل الدخول.
Django يدعم هذا السلوك بشكل جيد من خلال next.

مثال في صفحة login:

<form method="post">
    {% csrf_token %}
    <input type="hidden" name="next" value="{{ next }}">
    <input type="text" name="username">
    <input type="password" name="password">
    <button type="submit">Login</button>
</form>

وفي view login يمكنك تمرير next من الطلب:

def user_login(request):
    next_url = request.GET.get('next') or request.POST.get('next')

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            return redirect(next_url or 'home')

    return render(request, 'accounts/login.html', {'next': next_url})

هذا يجعل تجربة المستخدم أفضل، لأنه يعود مباشرة إلى المكان الذي كان يريده.


بناء نظام تسجيل دخول أكثر احترافية

في المشاريع الحقيقية، قد تحتاج إلى:

  • التحقق من البريد الإلكتروني

  • تفعيل الحساب عبر رسالة email

  • منع الدخول إذا كان الحساب غير مفعل

  • تسجيل آخر دخول

  • تتبع أنشطة المستخدم

  • حماية إضافية للصفحات الحساسة

كل هذه الأشياء يمكن بناؤها فوق نظام Django الجاهز.
الأهم أن تفهم الأساس أولًا، ثم توسع عليه خطوة خطوة.


أفضل ممارسات في Django Authentication

هناك عدة نصائح مهمة جدًا:

  1. لا تخزن كلمة المرور يدويًا كنص عادي.

  2. لا تعيد اختراع نظام تسجيل دخول من الصفر إلا إذا كنت مضطرًا.

  3. استخدم login_required للصفحات الخاصة.

  4. استخدم Groups وPermissions بدل الشروط العشوائية.

  5. فكّر في Custom User Model مبكرًا إذا كان مشروعك يحتاجه.

  6. استخدم رسائل Django messages لتوضيح ما يحدث للمستخدم.

  7. اختبر كل حالة: دخول صحيح، دخول خاطئ، خروج، صلاحيات، صفحات محمية.

  8. لا تنسَ csrf_token داخل الفورمات.

هذه النقاط تبدو بسيطة، لكنها تصنع فرقًا كبيرًا في جودة النظام.


مثال عملي لتطبيق منظم

يمكنك تنظيم التطبيق مثل هذا:

accounts/
    templates/
        accounts/
            login.html
            register.html
            dashboard.html
            profile.html
            change_password.html
    forms.py
    views.py
    urls.py

وفي project urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('accounts.urls')),
]

هذا التنظيم يجعل مشروعك واضحًا وسهل التوسعة.


مثال على accounts/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('login/', views.user_login, name='login'),
    path('logout/', views.user_logout, name='logout'),
    path('register/', views.register, name='register'),
    path('dashboard/', views.dashboard, name='dashboard'),
    path('profile/', views.profile, name='profile'),
    path('change-password/', views.change_password, name='change_password'),
]

مثال على home view

from django.shortcuts import render

def home(request):
    return render(request, 'accounts/home.html')

وفي home.html يمكنك عرض روابط الدخول أو لوحة التحكم حسب حالة المستخدم:

{% if request.user.is_authenticated %}
    <p>Welcome back, {{ request.user.username }}</p>
    <a href="{% url 'dashboard' %}">Dashboard</a>
{% else %}
    <a href="{% url 'login' %}">Login</a>
    <a href="{% url 'register' %}">Register</a>
{% endif %}

كيف تفكر كمطور عند بناء نظام المستخدمين؟

هذا جزء مهم جدًا.
لا تنظر إلى Login باعتباره مجرد نموذج. انظر إليه كبوابة أمنية وتجربة مستخدم في الوقت نفسه.

اسأل نفسك:

  • هل يجب أن يرى هذا الشخص هذه الصفحة؟

  • هل هذا المستخدم لديه الصلاحية؟

  • هل الحساب مفعل؟

  • هل أحتاج إلى تسجيل نشاطات المستخدم؟

  • هل من الأفضل استخدام البريد الإلكتروني بدل اسم المستخدم؟

  • هل أحتاج إلى صفحة بروفايل قابلة للتعديل؟

  • هل يجب أن يكون هناك فرق بين المستخدم العادي والمدير؟

هذه الأسئلة تجعل تصميمك أقوى وأكثر احترافية.


لمسة شخصية أخيرة

في كثير من المشاريع، يبدأ المطور من صفحة الدخول، ثم يكتشف لاحقًا أن التفكير في المستخدم من البداية كان أهم من شكل الصفحة نفسه.
لأن نجاح أي نظام لا يُقاس فقط بجمال الواجهة، بل أيضًا بمدى سهولة استخدامه وأمانه وتنظيمه.
وهنا Django يمنحك أرضية ممتازة، لكن يبقى عليك أن تفهم الأدوات جيدًا وتستخدمها بحكمة.

لا تتعجل في حفظ الأكواد فقط.
جرّب أن تبني النظام مرة، ثم أعد بناءه من الصفر مرة ثانية بعد يومين.
ستجد أن الفهم صار أعمق بكثير.
وهذا بالضبط ما يجعل Django ممتعًا: كل جزء تتعلمه اليوم سيفتح لك بابًا في مشروع أكبر غدًا.


الخلاصة

Django Authentication and User Management ليس موضوعًا ثانويًا، بل هو أحد أهم أعمدة أي تطبيق ويب حقيقي. في هذا المقال عرفنا كيف يعمل النظام، وكيف نبني:

  • تسجيل الدخول

  • تسجيل الخروج

  • إنشاء حساب

  • حماية الصفحات

  • إدارة المستخدم الحالي

  • الصلاحيات

  • المجموعات

  • تغيير كلمة المرور

  • تخصيص نموذج المستخدم عند الحاجة

والأهم من ذلك أننا فهمنا لماذا يستخدم Django هذا الأسلوب، وكيف نستفيد من الأدوات الجاهزة بدل بناء كل شيء يدويًا.

إذا أتقنت هذا الجزء جيدًا، ستصبح قادرًا على بناء أنظمة عضوية قوية، ولوحات تحكم احترافية، وتطبيقات أكثر أمانًا وتنظيمًا. وهذا من أهم المهارات التي يحتاجها أي مطور Django

#Django Authentication #Django User Management #Django Login Tutorial #Django Register Form #Django Logout #Django Permissions #Django Groups #Django Custom User Model