تتيح لك إدارة مستخدمي Django دمج مصادقة المستخدمين وإدارتهم في تطبيقات الويب. باستخدام Django، يمكنك الاستفادة من نظام المصادقة المدمج في الإطار لإدارة تسجيل المستخدمين وتسجيل الدخول وتسجيل الخروج. باستخدام بعض القوالب الإضافية، يمكنك تمكين المستخدمين من إعادة تعيين كلمات المرور وتغييرها بشكل مستقل.
يرشدك هذا الدرس خلال إعداد نظام إدارة مستخدمين أساسي باستخدام Django، والذي يمكنك توسيعه لاحقًا. ستتعلم كيفية إنشاء لوحة معلومات، وتنفيذ تسجيل المستخدم، وربط عناوين URL للمصادقة، بالإضافة إلى تخصيص قوالب لتسجيل الدخول والخروج وإدارة كلمات المرور.
ابدأ بالأساسيات
للمشاريع الأكبر حجمًا، يمكنك إنشاء نموذج مستخدم مخصص. في هذا الدرس، ستستخدم نموذج المستخدم المدمج في Django. يُعد هذا نقطة انطلاق ممتازة للتعرف على مصادقة المستخدم بشكل عام.
في هذا القسم من الدرس، ستُنشئ أولًا مشروع Django صغيرًا بتطبيق مستخدم. بعد ذلك، ستُجري بعض التعديلات على مُتحقق كلمات المرور في Django لتسهيل عملية التطوير. وأخيرًا، ستُنشئ مستخدمًا إداريًا للتحقق من إعداداتك.
إعداد مشروع Django
يُنصح باستخدام بيئة افتراضية عند العمل على مشاريع بايثون. بهذه الطريقة، يمكنك دائمًا التأكد من أن أمر بايثون يشير إلى الإصدار الصحيح من بايثون، وأن الوحدات التي يتطلبها مشروعك تحتوي على الإصدارات الصحيحة. لمعرفة المزيد حول إنشاء بيئات افتراضية، راجع “بيئات بايثون الافتراضية: دليل تمهيدي”.
PS> python -m venv venv\
PS> .\venv\Scripts\activate
(venv) PS>
باستخدام الأوامر المذكورة أعلاه، يمكنك إنشاء بيئة افتراضية باسم venv وتنشيطها باستخدام وحدة venv المدمجة في بايثون. يشير الرمز (venv) الموجود بين قوسين أمام موجه الأوامر إلى نجاح تنشيط البيئة الافتراضية.
الآن بعد أن أصبحت البيئة جاهزة، يمكنك تثبيت Django، وبدء مشروع جديد، وإنشاء تطبيق لتخزين كل كود إدارة المستخدم الخاص بك:
(venv) $ python -m pip install Django
(venv) $ django-admin startproject user_auth_intro
(venv) $ cd user_auth_intro
(venv) $ python manage.py startapp users
في هذا المثال، سمّي مشروعك user_auth_intro وتطبيقك users. لتضمين تطبيق users في مشروع Django، عليك إضافة مرجع إلى فئة إعداد التطبيق في بداية قائمة INSTALLED_APPS في ملف settings.py:
# ...
INSTALLED_APPS = [
"users.apps.UsersConfig",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
# ...
بإضافة users.apps.UsersConfig، تُعلم Django بوجود تطبيق users الذي أنشأته للتو. إذا ألقيت نظرة على قائمة INSTALLED_APPS، فستجد نظام المصادقة الافتراضي لـ Django في السطر السادس. في django.contrib.auth، يخزن Django جوهر إطار عمل المصادقة الخاص به والنماذج الافتراضية التي ستبني عليها لاحقًا.
بعد ذلك، قم بتطبيق عمليات الترحيل وتشغيل خادم تطوير Django:
(venv) $ python manage.py migrate
(venv) $ python manage.py runserver
تعمل هذه الأوامر على إنشاء كافة النماذج الافتراضية في قاعدة البيانات وبدء تشغيل خادم تطوير Django.
إلغاء تنشيط مدقق كلمة المرور
افتراضيًا، يفرض Django كلمات مرور قوية لجعل حسابات المستخدمين أقل عرضة للهجمات. نظرًا لضرورة تغيير كلمات المرور باستمرار خلال هذا البرنامج التعليمي، فإن اختيار كلمة مرور قوية في كل مرة سيكون صعبًا.
لمعالجة هذه المشكلة، يمكنك تعطيل مُتحققات كلمات المرور في الإعدادات. ما عليك سوى إضافة تعليقات عليها، وترك قائمة فارغة:
# ...
AUTH_PASSWORD_VALIDATORS = [
# {
# "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
# },
# {
# "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
# },
# {
# "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
# },
# {
# "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
# },
]
# ...
الآن، يتيح لك Django تعيين كلمات مرور مثل pass أو حتى 1234، مما يُسرّع عملك مع نظام إدارة المستخدمين بشكل كبير. تذكر فقط تفعيل أدوات التحقق في تطبيقك!
إنشاء مستخدم مسؤول Django
في هذا البرنامج التعليمي، من المفيد أيضًا الوصول إلى موقع الإدارة لتتمكن من تتبع المستخدمين الجدد وكلمات مرورهم. أنشئ حسابًا إداريًا:
(venv) $ python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: 1234
Password (again): 1234
Superuser created successfully.
يُسهّل ضبط مُتحققات كلمات المرور في Django استكشاف نظام المصادقة. على سبيل المثال، يمكنك استخدام أي كلمة مرور تُريدها لمستخدم المسؤول. كما ذُكر سابقًا، ستحتاج إلى تفعيل مُتحققات كلمات المرور لاحقًا.
إذا أردت، يمكنك زيارة الرابط http://127.0.0.1:8000/admin/ للتحقق من إمكانية تسجيل الدخول إلى موقع إدارة Django. عند القيام بذلك، انتبه للنماذج والأزرار التي تظهر لك أثناء عملية تسجيل الدخول. ستعيد إنشاء مسار مشابه في تطبيق المستخدمين.
إعداد نظام إدارة مستخدمي Django
تحتوي معظم أنظمة إدارة المستخدمين على صفحة رئيسية، تُعرف عادةً بلوحة المعلومات. ستجد فيها روابط التسجيل، وتسجيل الدخول، وتسجيل الخروج كمستخدم.
بالإضافة إلى لوحة المعلومات، ستتوفر لديك صفحات أخرى لاحقًا. لذلك، ستبدأ بإنشاء قالب أساسي ترث منه الصفحات الأخرى هيكلًا متسقًا مع قوالبها الفرعية.
إنشاء هيكل القالب الأساسي
ستضع جميع القوالب التي تستخدمها في هذا البرنامج التعليمي في مجلد users/templates/. هذا المجلد غير موجود افتراضيًا، لذا عليك إنشاؤه أولًا. بعد ذلك، أنشئ ملف base.html بالمحتوى التالي:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>User Management Intro</title>
</head>
<body>
<h1>Welcome!</h1>
{% block content %}
{% endblock content %}
</body>
</html>
يحتوي القالب الأساسي على البنية الأساسية لمستند HTML النموذجي. يعرض العنوان رسالة ترحيب!، وتُعرّف كتلة باسم “المحتوى”. هذه الكتلة فارغة حاليًا، ولكن ستستخدمها قوالب أخرى لإضافة محتواها الخاص.
لتنظيم قوالبك بشكل صحيح حتى يتمكن Django من العثور عليها، قم بإنشاء مجلدين لقالبك الفرعي:
users/templates/users/users/templates/registration/
يُنظّم نظام تسمية مجلدات القوالب هذا قوالبك بشكل مُرتّب. قد يبدو دمج مجلدات القوالب بهذا الشكل مُكررًا بعض الشيء، ولكنه يُتيح لك إنشاء قوالب بنفس الأسماء في المجلدات الفرعية. في هذا البرنامج التعليمي، ستعمل مع ملف قالب أساسي واحد فقط، لذا لا بأس من الاحتفاظ بملف base.html مباشرةً في مجلد templates/.
إضافة صفحة لوحة التحكم
عند إنشاء صفحات جديدة في Django، ستحتاج عادةً إلى قالب، وواجهة لعرض القالب، ورابط URL يستخدم الواجهة. تتبع صفحة لوحة التحكم هذه العملية المكونة من ثلاث خطوات. بما أنك لم تُحدد أي عناوين URL لتطبيق users بعد، فهناك أيضًا خطوة رابعة لربط عناوين URL الخاصة ب users بمشروع Django. ستُنفّذ هذه الخطوات واحدة تلو الأخرى!
ابدأ بإنشاء قالب لوحة المعلومات. نظرًا لأن هذا القالب خاص ب users/ app، يمكنك حفظه في المجلد users/template/users/. يجب أن يكون اسم القالب هو dashboard.html، وأن يكون امتدادًا للقالب الأساسي:
{% extends "base.html" %}
{% block content %}
Hello, {{ user.username|default:"Guest" }}!
{% endblock content %}
حاليًا، يعرض القالب رسالة الترحيب باسم المستخدم الحالي فقط. إذا لم يكن المستخدم مسجلاً الدخول، فسيُعيّن Django متغير user باستخدام كائن AnonymousUser. اسم المستخدم المجهول دائمًا ما يكون فارغًا، لذا ستعرض لوحة التحكم “Hello, Guest!”.
بعد ذلك، قم بإنشاء عرض dashboard في users/views.py الذي يعرض قالب لوحة المعلومات.html:
from django.shortcuts import render
def dashboard(request):
return render(request, "users/dashboard.html")
من التفاصيل المثيرة للاهتمام في dashboard أنك تُقدّم القالب بمجرد توفير كائن request. مع ذلك، سيتمكن Django من العمل مع متغير user الذي تستخدمه في ملف dashboard.html لأن معلومات المستخدم مُخزّنة في RequestContext. ستتحقق من هذا السلوك قريبًا.
في الوقت الحالي، استمر بإنشاء ملف users/urls.py وأضف مسارًا لعرض dashboard:
from django.urls import path
from . import views
urlpatterns = [
path("dashboard/", views.dashboard, name="dashboard"),
]
أخيرًا، أضف عناوين URL الخاصة بتطبيقك إلى عناوين URL الخاصة بمشروعك:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("", include("users.urls")),
path("admin/", admin.site.urls),
]
يمكنك الآن اختبار عرض لوحة التحكم. افتح http://127.0.0.1:8000/dashboard/ في متصفحك. ستظهر لك شاشة مشابهة لهذه:

هذا يعني أن دجانجو نجح في التعامل مع متغير قالب user. في هذه الحالة، المستخدم مجهول الهوية، ولا يمتلك خاصية .username، لذا تظهر رسالة ” Hello, Guest! “.
إذا لم تكن مسجلاً الدخول، فستستقبلك صفحة لوحة التحكم كضيف. عند فتح موقع الإدارة على الرابط http://127.0.0.1:8000/admin/ وتسجيل الدخول كمستخدم إداري، ستبدو لوحة التحكم مختلفة قليلاً عند العودة إليها:

كما ترى، يعرض قالبك الجديد اسم المستخدم المُسجَّل دخوله حاليًا بشكل صحيح. في هذه الحالة، ستُرحِّبك لوحة المعلومات كمسؤول. بداية رائعة!
تنفيذ تسجيل المستخدم
أنت حاليًا مدير المشروع، ويمكنك تسجيل الدخول عبر نموذج تسجيل الدخول على موقع الإدارة. إذا كنت ترغب في إضافة مستخدمين جدد إلى مشروعك، فعليك إنشاء حساباتهم بنفسك. هذا ليس عمليًا جدًا. بدلًا من ذلك، ستنشئ صفحة تسجيل حيث يمكن للمستخدمين التسجيل بأنفسهم.
لإنشاء هذه الصفحة، اتبع نفس خطوات أي صفحة أخرى في مشروع Django. ابدأ بتسجيل رابط URL يتصل بواجهة عرض، والذي بدوره يُنشئ قالبًا. ابدأ بإضافة رابط “sign_up” إلى ملف urls.py في تطبيق users:
from django.urls import path
from . import views
urlpatterns = [
path("dashboard/", views.dashboard, name="dashboard"),
path("sign_up/", views.sign_up, name="sign_up"),
]
بعد ذلك، أضف عرض sign_up الذي يضيف مستخدمًا إلى قاعدة البيانات عندما ترسل نموذج التسجيل مع طلب “POST”:
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import redirect, render
from django.urls import reverse
def dashboard(request):
return render(request, "users/dashboard.html")
def sign_up(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect(reverse("dashboard"))
else:
form = UserCreationForm()
return render(request, "registration/sign_up.html", {"form": form})
هذا العرض نموذجي جدًا لعرض يعمل مع النماذج. عند الوصول إلى صفحة التسجيل باستخدام طلب “GET”، سترى نموذجًا فارغًا يمكنك تعبئته للتسجيل. بعد إرسال نموذج صالح مع الطلب، تحفظ بيانات النموذج في قاعدة بياناتك. في هذه الحالة، يُنشأ مستخدم جديد. ثم تُعيد توجيه الطلب إلى صفحة لوحة المعلومات.
هناك تفصيل مهم يجب ملاحظته بعد حفظ النموذج. في السطر ١٤، تستخدم دالة ()login في Django لتسجيل دخول المستخدم. إذا حذفت هذا السطر، فسيتم تسجيل المستخدم، ولكنه سيبقى مسجلاً خروجًا بعد التسجيل. استخدام ()login يوفر على المستخدمين خطوةً ويُبسّط عملية التسجيل.
في السطر ١٨، ستُقدّم قالب sign_up.html من داخل مجلد فرعي /Registration. أنشئ ملف sign_up.html بالمحتوى التالي:
{% extends "base.html" %}
{% block content %}
<h2>Sign Up</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Sign Up" />
</form>
<p>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
سيعرض هذا عنوان “التسجيل”، متبوعًا بنموذج تسجيل دخول. يستخدم Django قاموسًا، يُعرف أيضًا بcontext، لتمرير البيانات إلى قالب أثناء عرضه. في هذه الحالة، سيكون متغير “form” مُضمّنًا بالفعل في السياق – كل ما عليك فعله هو عرضه. سيؤدي استخدام {{form.as_p}} إلى عرض النموذج كسلسلة من فقرات HTML.
يُدرج السطر {% csrf_token %} رمز تزوير طلبات المواقع المتعددة (CSRF)، وهو مطلوب في كل نموذج Django. يوجد أيضًا زر لإرسال النموذج، وفي نهاية القالب رابط يُعيد المستخدمين إلى لوحة التحكم.
للتأكد من أن صفحة التسجيل الخاصة بك تعمل، توجه إلى http://127.0.0.1:8000/sign_up وقم بإنشاء مستخدم جديد:

بعد إرسال نموذج التسجيل، يُسجِّل المستخدم دخوله تلقائيًا ويُرحَّب به شخصيًا على صفحة لوحة المعلومات. تهانينا، يمكنك الآن تسجيل مستخدمين جدد! بعد ذلك، ستُضيف خاصية تسجيل الدخول والخروج.
العمل مع Django Auth
يحتاج موقع ويب كامل إلى أكثر من مجرد لوحة تحكم لإدارة المستخدمين. لحسن الحظ، يأتي Django مزودًا بنظام مصادقة ونظام تفويض، يُختصران عادةً بـ Django auth لتغطية كلا المصطلحين:
- المصادقة: هي عملية التحقق من هوية المستخدم، على سبيل المثال، تسجيل الدخول.
- التفويض: هي عملية تحديد ما يُسمح للمستخدم بفعله، على سبيل المثال، بعد تسجيل الدخول.
يحتوي Django auth على العديد من عناوين URL والعروض المتعلقة بإدارة المستخدمين، والتي ستتولى إدارة أهم العمليات، بما في ذلك تسجيل الدخول وتسجيل الخروج وتغيير كلمة المرور وإعادة تعيينها. مع ذلك، ستحتاج إلى إنشاء قوالب خاصة بهذه العمليات.
في هذا القسم من الدرس، ستضيف أولاً عناوين URL لتسجيل الدخول والخروج إلى مشروعك. بعد ذلك، ستتولى جميع القوالب لتسهيل عملية تفويض المستخدمين.
ربط عناوين URL والعروض الخاصة بالمصادقة
للاستفادة من أنظمة المصادقة والتفويض المدمجة في Django، عليك استخدام ملف django.contrib.auth. المدخل هو URLConf الخاص بالوحدة، وهو اختصار لـ URL configuration (تكوين عنوان URL). الخطوة الأولى هي إضافة django.contrib.auth.urls إلى ملف urls.py الخاص بتطبيقك:
from django.urls import include, path
from . import views
urlpatterns = [
path("accounts/", include("django.contrib.auth.urls")),
path("dashboard/", views.dashboard, name="dashboard"),
path("sign_up/", views.sign_up, name="sign_up"),
]
بإضافة رابط URLConf الخاص بـ Django django.contrib.auth.urls إلى رابط تطبيق user، تُضيف تلقائيًا مجموعة من روابط URL إلى مشروعك، مثل روابط تسجيل دخول المستخدمين وخروجهم. يأتي كل رابط باسم يمكنك استخدامه لاحقًا في قوالبك، وتُمكّنك العروض المرتبطة بهذه الروابط من إجراء مهمة مصادقة.
| عنوان URL | المهمة | الاسم |
|---|---|---|
accounts/login/ | تسجيل دخول المستخدم إلى تطبيقك | "login" |
accounts/logout/ | تسجيل خروج المستخدم من تطبيقك | "logout" |
بالإضافة إلى ذلك، يوفر django.contrib.auth.urls روابط لمهام أكثر تقدمًا، مثل تغيير كلمات المرور وإعادة تعيينها. ستتعرف عليها لاحقًا في هذا البرنامج التعليمي.
الآن بعد أن أصبحت الحسابات/عناوين URL موجودة في تطبيقك ومتصلة بالفعل بالعروض المقابلة في django.contrib.auth.views، قم بالخطوة الأولى وقم بزيارة http://127.0.0.1:8000/accounts/login/:

من المتوقع ظهور خطأ “TemplateDoesNotExist” لأنك تحتاج إلى إنشاء القوالب بنفسك. ولكن، كما هو الحال مع استثناءات بايثون الأخرى، فإن رسالة الخطأ مفيدة جدًا، وتمنحك معلومتين مهمتين:
- يبحث عنوان “login” عن LoginView.
- يبحث LoginView عن قالب في Registration/ يسمى login.html.
يمكنك زيارة روابط URL الأخرى، وسترى رسائل خطأ مشابهة لمعظمها. للتخلص من هذه الأخطاء، يجب إنشاء القوالب التي تتوقعها العروض.
إذا مررت لأسفل الصفحة التي تحتوي على رسالة الخطأ، يمكنك إلقاء نظرة على قسم تحليل بيانات مُحمّل القالب. هناك، ستلاحظ أن Django يحاول تحديدًا تحميل القوالب من المسار users/templates/registration/ أولًا. هنا ستُنشئ قوالب إدارة المستخدمين.
إنشاء صفحة تسجيل الدخول
لصفحة تسجيل الدخول، سيحاول Django استخدام قالب يُسمى login.html موجود داخل ملف users/templates/registration/. داخل ملف Registration/، أضف ملف login.html بالمحتوى التالي:
{% extends "base.html" %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Login" />
</form>
<p>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
يبدو قالب صفحة تسجيل الدخول مشابهًا جدًا لقالب التسجيل. الفرق الوحيد هو العنوان وقيمة الزر. كما أن النموذج يعرض حقلًا واحدًا فقط لإدخال كلمة المرور، مقارنةً بنموذج التسجيل الذي يتطلب منك تكرار كلمة المرور التي حددتها.
عندما تقوم بزيارة http://127.0.0.1:8000/accounts/login مرة أخرى، فستتمكن من رؤية أن Django قد قام الآن بنجاح بعرض صفحة تسجيل الدخول الخاصة بك باستخدام القالب الجديد:

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

وفقًا لرسالة الخطأ، يتعذر على Django العثور على مسار لـ accounts/profile/، وهو الوجهة الافتراضية لمستخدميك بعد تسجيل دخول ناجح. يبدو أن Django غير مزود بعرض ملف تعريف. ولكن هذه ليست مشكلة، لأن لديك بالفعل عرض لوحة التحكم الذي يمكنك إعادة استخدامه.
إعادة توجيه عمليات تسجيل الدخول
يوفر لك Django خيارين لتغيير إعادة التوجيه الافتراضية بعد تسجيل دخول ناجح. الخيار الأول هو ضبط LOGIN_REDIRECT_URL في ملف settings.py إلى عنوان URL المفضل لإعادة توجيه طلبك إليه. الخيار الثاني هو تعديل شكل قالب login.html.
بشكل عام، يُعد تعديل LOGIN_REDIRECT_URL استراتيجية فعّالة. ولكن بما أنك ترغب في إعادة التوجيه إلى صفحة لوحة التحكم، فستحتاج إلى الرجوع إلى عنوان URL من تطبيق آخر في إعدادات مشروعك. إذا قررتَ إزالة تطبيق المستخدمين من مشروع Django في وقتٍ لاحق، فسيتعين عليك أيضًا تذكر إزالة أو تحديث LOGIN_REDIRECT_URL.
ملاحظة: إذا كنت تريد تجربة تعديل ملف الإعدادات، فيجب عليك إضافة LOGIN_REDIRECT_URL = “dashboard” إلى settings.py.
يتيح لك تعديل نموذج login.html تحكمًا دقيقًا في المكان الذي تريد إعادة توجيه الطلب إليه بعد تسجيل دخول ناجح. كل ما عليك فعله هو تعديل المعلمة التالية التي تُرسلها مع النموذج.
افتح login.html وأضف المعلمة next بمساعدة حقل إدخال مخفي:
{% extends "base.html" %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Login" />
<input type="hidden" name="next" value="{% url 'dashboard' %}" />
</form>
<p>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
حاول الآن تسجيل الدخول مرة أخرى. سيتم توجيهك إلى صفحة لوحة التحكم حيث ستجد اسم المستخدم الخاص بك.
تفعيل تسجيل الخروج
الآن، يمكن لمستخدميك تسجيل الدخول، ولكن يجب أن يتمكنوا أيضًا من تسجيل الخروج. تختلف هذه العملية قليلًا عن تسجيل الدخول. إذا ألقيت نظرة على روابط URL التي يوفرها مصادقة Django، فستجد رابط ” accounts/logout/“. مع ذلك، لا يُفترض بك زيارة هذا الرابط في المتصفح كما فعلت في صفحة تسجيل الدخول.
ملاحظة: في الإصدارات السابقة من Django، كان بإمكانك تسجيل الخروج باستخدام طلب GET من خلال الوصول إلى
accounts/logout/. مع إصدار Django 5.0، أصبح العرض خلفaccounts/logout/يقبل طلبات POST فقط.
بدلاً من إنشاء قالب لعرض تسجيل الخروج، يجب عليك إنشاء نموذج يُرسل طلب نشر إلى accounts/logout/. بعد ذلك، يمكنك تضمين هذا النموذج في أي مكان ترغب فيه لتوفير خاصية تسجيل الخروج.
للإشارة إلى أن قالب تسجيل الخروج مُضمّن في قوالب أخرى، يمكنك إضافة بادئة _ إلى اسم الملف وتسميته logout.html_. خزّن القالب بجوار login.html، واتبع نمطًا مشابهًا مع الحقل المخفي:
<form method="post" action="{% url 'logout' %}">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Logout" />
<input type="hidden" name="next" value="{% url 'dashboard' %}" />
</form>
بما أن القالب مُضمّن ضمن قوالب أخرى، وليس مُقدَّمًا بشكل مُستقل، فلا حاجة لتوسيع أي قوالب أخرى. ما عليك سوى إضافة الكود الخاص بالنموذج.
في السطر الأول، تُضيف أيضًا سمة action لإعلام المتصفح بمكان إرسال الطلب. من المهم إضافة صفحة “logout” هنا. وإلا، فسيُرسل النموذج طلب POST إلى نفس عنوان URL الذي تستخدمه حاليًا ولن يُسجل خروجك.
افتح ملف dashboard.html وقم بتضمين النموذج logout.html_:
{% extends "base.html" %}
{% block content %}
Hello, {{ user.username|default:"Guest" }}!
<hr />
{% include "registration/_logout.html" %}
{% endblock content %}
عند زيارة http://127.0.0.1:8000/dashboard، سترى الزر الذي يقوم بتسجيل خروج المستخدم الخاص بك:

حاليًا، عملية تسجيل الخروج دقيقة للغاية. عند النقر على الزر، سيتغير اسم المستخدم إلى “ضيف” في رسالة الترحيب بلوحة التحكم. لكن زر تسجيل الخروج سيظل ظاهرًا حتى بعد تسجيل الخروج. لذا، قبل إنهاء هذا القسم، حان الوقت لتحديث لوحة التحكم لتعكس الوضع الحالي لنظام إدارة المستخدمين لديك.
تحديث لوحة المعلومات
لوحة التحكم لديك بسيطة جدًا حاليًا. زر تسجيل الخروج موجود دائمًا، حتى عند تسجيل خروج المستخدمين. للتسجيل أو تسجيل الدخول، يجب عليك زيارة الروابط بكتابتها في شريط عناوين المتصفح. يمكنك حل هذه المشاكل بتحديث قالب لوحة التحكم:
{% extends "base.html" %}
{% block content %}
Hello, {{ user.username|default:"Guest" }}!
<hr />
{% if user.is_authenticated %}
{% include "registration/_logout.html" %}
{% else %}
<a href="{% url 'login' %}">Login</a>
<a href="{% url 'sign_up' %}">Sign up</a>
{% endif %}
{% endblock content %}
لعرض زر تسجيل الخروج أو رابطي تسجيل الدخول والتسجيل بشكل مشروط، استخدم user.is_authenticated. إذا كان المستخدم مُصادقًا عليه، فسيظهر زر تسجيل الخروج. وإلا، فسيظهر رابطا صفحة تسجيل الدخول وصفحة التسجيل.
يمكنك زيارة http://127.0.0.1:8000/dashboard ومعرفة كيفية عمل لوحة المعلومات المحدثة.
عند تسجيل خروج المستخدم، يُمكنه اختيار تسجيل الدخول أو التسجيل. إذا كان لديه حساب مُسبق، يُمكنه النقر على “تسجيل الدخول” وإدخال بيانات اعتماده في صفحة تسجيل الدخول.
للمستخدمين الذين ليس لديهم حساب، يمكنك توفير خيار التسجيل. في كلتا الحالتين، يتم تسجيل دخول المستخدم لاحقًا، وعندها يظهر زر تسجيل الخروج في لوحة التحكم.
ممتاز! يبدو أن لديك الآن نظام إدارة مستخدمين فعال. ما دام المستخدمون يتذكرون كلمات مرورهم، فسيكون كل شيء على ما يرام.
التعامل مع كلمات المرور
حاليًا، يفتقر نظام إدارة المستخدمين لديك إلى ميزتين مهمتين للتعامل مع كلمات المرور:
- تغيير كلمة المرور: تريد أن تتمكن من تغيير كلمة المرور الخاصة بك من وقت لآخر للحفاظ على أمان حسابك.
- إعادة تعيين كلمة المرور الخاصة بك: في حالة نسيان كلمة المرور الخاصة بك، فأنت تريد أن تتمكن من إعادة تعيينها.
يتيح لك البناء على Django auth لإدارة المستخدمين لديك البدء في تنفيذ الوظائف الخاصة بتغيير وإعادة تعيين كلمات المرور في مشروعك.
هل تذكر كيف أضفتَ رابط URLConf الخاص بـ Django إلى رابط تطبيق المستخدم، فأضفتَ تلقائيًا مجموعةً من الروابط إلى مشروعك؟ على سبيل المثال، أضافَ روابط لتسجيل دخول المستخدمين وخروجهم. كما أضافَ هذه الروابط لتغيير وإعادة تعيين كلمات المرور:
| عنوان URL | المهمة | الاسم |
|---|---|---|
accounts/password_change/ | تغيير كلمة المرور | "password_change" |
accounts/password_change/done/ | إظهار تأكيد على تغيير كلمة المرور | "password_change_done" |
accounts/password_reset/ | اطلب بريدًا إلكترونيًا يحتوي على رابط إعادة تعيين كلمة المرور | "password_reset" |
accounts/password_reset/done/ | إظهار تأكيد إرسال بريد إلكتروني لإعادة تعيين كلمة المرور | "password_reset_done" |
accounts/reset/<uidb64>/<token>/ | تعيين كلمة مرور جديدة باستخدام رابط إعادة تعيين كلمة المرور | "password_reset_confirm" |
accounts/reset/done/ | إظهار تأكيد على إعادة تعيين كلمة المرور | "password_reset_complete" |
ما في السابق، يأتي كل رابط URL باسم يمكنك استخدامه لاحقًا في قوالبك، وتتيح لك العروض المرتبطة به إجراء عملية مصادقة. لنبدأ بتغيير كلمات المرور!
تغيير كلمات المرور
قد يرغب مستخدموك في تغيير كلمات مرورهم في مرحلة ما. بدلًا من مطالبة المشرف بذلك، يمكنك إضافة نموذج لتغيير كلمة المرور إلى تطبيقك. يحتاج Django إلى قالبين لإتمام هذه العملية:
- Registration/password_change_form.html لعرض نموذج تغيير كلمة المرور.
- Registration/password_change_done.html لإظهار تأكيد على أن كلمة المرور قد تم تغييرها بنجاح.
ابدأ بـ Registration/password_change_form.html
{% extends "base.html" %}
{% block content %}
<h2>Change password</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Change" />
</form>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
{% endblock content %}
يبدو هذا القالب مشابهًا تقريبًا لقالب تسجيل الدخول الذي أنشأته سابقًا. ولكن هذه المرة، سيضيف Django نموذج تغيير كلمة المرور هنا، وليس نموذج تسجيل الدخول، لذا سيعرضه المتصفح بشكل مختلف.
القالب الآخر الذي تحتاج إلى إنشائه هو Registration/password_change_done.html:
{% extends "base.html" %}
{% block content %}
<h2>Password changed</h2>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
{% endblock content %}
بعد تغيير كلمة المرور، ستظهر صفحة “تم تغيير كلمة المرور” للتحقق من نجاح العملية. وكما هو الحال في الصفحات الأخرى، يُنصح بإضافة رابط إلى لوحة التحكم.
لتسهيل الوصول إلى تغيير كلمة المرور، أضف رابطًا إلى لوحة التحكم لنموذج تغيير كلمة المرور الذي أنشأته حديثًا. ما عليك سوى التأكد من أنه يظهر فقط للمستخدمين المسجلين:
{% extends "base.html" %}
{% block content %}
Hello, {{ user.username|default:"Guest" }}!
<hr />
{% if user.is_authenticated %}
{% include "registration/_logout.html" %}
<a href="{% url 'password_change' %}">Change password</a>
{% else %}
<a href="{% url 'login' %}">Login</a>
<a href="{% url 'sign_up' %}">Sign up</a>
{% endif %}
{% endblock content %}
إذا اتبعت الرابط في متصفحك، فيجب أن ترى النموذج التالي:

جرّبه. غيّر كلمة المرور، سجّل الخروج، ثم سجّل الدخول مجددًا. يمكنك أيضًا محاولة الوصول إلى صفحة تغيير كلمة المرور دون تسجيل الدخول، وذلك بالوصول إلى الرابط http://127.0.0.1:8000/accounts/password_change/ مباشرةً من متصفحك. يتميز Django بالذكاء الكافي لاكتشاف ضرورة تسجيل الدخول أولًا، وسيُعيد توجيهك تلقائيًا إلى صفحة تسجيل الدخول.
روابط طلب إعادة تعيين كلمة المرور
الأخطاء تحدث للجميع، وقد ينسى أحدهم كلمة مروره بين الحين والآخر. يجب أن يتعامل نظام إدارة مستخدمي Django لديك مع هذه الحالة أيضًا. هذه الوظيفة أكثر تعقيدًا بعض الشيء، إذ يتطلب العمل مع روابط إعادة تعيين كلمة المرور ثلاثة متطلبات:
- يجب على المستخدمين تقديم عنوان بريد إلكتروني عند التسجيل.
- يجب أن يكون لديك قالب بريد إلكتروني لإرساله.
- يجب أن يكون تطبيقك قادرًا على إرسال رسائل البريد الإلكتروني.
حتى الآن، يحتاج المستخدم فقط إلى اسم مستخدم وكلمة مرور للتسجيل في تطبيقك. هذه بداية جيدة. مع ذلك، عند الرغبة في إعادة تعيين كلمة المرور، فإن مجرد طلب اسم المستخدم يُعدّ محفوفًا بالمخاطر. بدلاً من ذلك، يُفضّل إرسال بريد إلكتروني إلى عنوان البريد الإلكتروني الذي يُقدّمه. يضمن هذا النهج أن يتمكن المستخدمون من إعادة تعيين كلمات المرور بأنفسهم.
لطلب عنوان بريد إلكتروني أثناء التسجيل، ستحتاج إلى تعديل نموذج التسجيل. للقيام بذلك، أنشئ ملف بايثون جديدًا باسم users/forms.py وأضف نموذجًا مخصصًا:
from django.contrib.auth.forms import UserCreationForm
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
fields = UserCreationForm.Meta.fields + ("email",)
في ملف forms.py الذي أنشأته حديثًا، ستنشئ CustomUserCreationForm مخصصًا يمتد إلى UserCreationForm. تحتفظ الفئة الداخلية Meta بمعلومات إضافية حول النموذج، وفي هذه الحالة، تمتد إلى UserCreationForm.Meta، لذا سيتم إعادة استخدام كل شيء تقريبًا من نموذج Django.
الفرق الرئيسي هو سمة .fields، التي تُحدد الحقول التي سيتم تضمينها في النموذج. سيستخدم نموذجك المُخصص جميع الحقول من UserCreationForm، وسيُضيف حقل البريد الإلكتروني.
الآن بعد أن أصبح النموذج جاهزًا، قم بتحديث عرض التسجيل في users/views.py للعمل مع Custom UserCreationForm:
from django.contrib.auth import login
# Remove: from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import redirect, render
from django.urls import reverse
from .forms import CustomUserCreationForm
def dashboard(request):
return render(request, "users/dashboard.html")
def sign_up(request):
if request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect(reverse("dashboard"))
else:
form = CustomUserCreationForm()
return render(request, "registration/sign_up.html", {"form": form})
بدلاً من استخدام UserCreationForm، ستستخدم الآن CustomUserCreationForm الذي تستورده من forms.py. داخل ()sign_up، ستحتاج إلى تحديث قيم النموذج لاستخدام CustomUserCreationForm. يبقى باقي sign_up كما هو.
قم بإنشاء مستخدم جديد للتحقق من عملية التسجيل المحدثة:

ممتاز. الآن، بما أنك تحتاج إلى عناوين بريد إلكتروني للمستخدمين الجدد، يمكنك المتابعة وإنشاء قالب باسم password_reset_form.html في ملف registration/:
{% extends "base.html" %}
{% block content %}
<h2>Send password reset link</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Send Reset Link" />
</form>
<p>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
سيظهر هذا القالب عند زيارة الرابط http://127.0.0.1:8000/accounts/password_reset. يُنصح أيضًا بإضافة رابط لهذه الصفحة في صفحة تسجيل الدخول.
{% extends "base.html" %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Login" />
<input type="hidden" name="next" value="{% url 'dashboard' %}" />
</form>
<p>
<a href="{% url 'password_reset' %}">Forgot your password?</a>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
الآن، عندما يكون المستخدم في صفحة تسجيل الدخول وينسى كلمة المرور، يمكنه النقر على رابط صفحة “password_reset”. بعد طلب رابط إعادة التعيين، يرسل Django رابط إعادة التعيين إلى عنوان البريد الإلكتروني المُدخل ويُعيد توجيه المستخدم إلى صفحة “password_reset_done”. لهذه الصفحة، عليك أيضًا إنشاء قالب:
{% extends "base.html" %}
{% block content %}
<h2>Password reset link sent</h2>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
{% endblock content %}
اسم “password_reset_done” مُضلِّل بعض الشيء. حتى الآن، لم يُعِد جانجو ضبط كلمة المرور بعد. لن تتم إعادة ضبط كلمة المرور إلا بعد نقر المستخدم على الرابط الموجود في رسالة إعادة ضبط كلمة المرور التي يُرسلها جانجو.
إرسال رسائل البريد الإلكتروني لإعادة تعيين كلمة المرور
جرّب طلب إعادة تعيين كلمة المرور. يبدو أن كل شيء يعمل كما هو متوقع في المتصفح. لكن دجانجو لا يرسل أي رسائل بريد إلكتروني حاليًا. للقيام بذلك، عليك إعداد بريد إلكتروني لمشروعك.
هناك أنواع مختلفة من واجهات البريد الإلكتروني في Django. أثناء التطوير، غالبًا ما يكون من الأنسب إخراج أي رسائل بريد إلكتروني إلى جهازك الطرفي باستخدام واجهة البريد الإلكتروني لوحدة التحكم. افتح ملف settings.py وأضف هذا السطر من التعليمات البرمجية إلى الملف:
# ...
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
# ...
في بيئة الإنتاج، قد ترغب في تعريف واجهة بريد إلكتروني مخصصة. حاليًا، يتيح لك ضبط EMAIL_BACKEND إلى “django.core.mail.backends.console.EmailBackend” نسخ رابط إعادة تعيين كلمة المرور ولصقه من نافذة الأوامر.
ملاحظة: إذا كنت تريد تعديل قالب البريد الإلكتروني لإعادة التعيين، فيمكنك إضافة قالبك الخاص في registration/password_reset_email.html.
حاول طلب إعادة تعيين كلمة المرور مرة أخرى. أثناء ذلك، انظر إلى النتيجة في نافذة الطرفية التي يعمل عليها خادم تطوير Django. بعد النقر على زر “إرسال رابط إعادة التعيين”، سترى محتوى رسالة إعادة
Content-Transfer-Encoding: 8bit
Subject: Password reset on 127.0.0.1:8000
From: webmaster@localhost
To: philipp@realpython.com
Date: Wed, 18 Dec 2024 10:08:34 -0000
Message-ID: <173287491425.58492.16858044530563413153@philipp>
You're receiving this email because you requested a password reset
for your user account at 127.0.0.1:8000.
Please go to the following page and choose a new password:
http://127.0.0.1:8000/accounts/reset/Nw/ch906a-de23fda8df503bf8567b6485a/
Your username, in case you've forgotten: Philipp
Thanks for using our site!
The 127.0.0.1:8000 team
قد يبدو بعض المحتوى غريبًا بعض الشيء نظرًا لوجودك على خادم التطوير المحلي. الجزء المهم من هذه النتيجة هو رابط إعادة التعيين. هذا هو الرابط الذي يجب على المستخدم النقر عليه لبدء إعادة تعيين كلمة المرور.
إعادة تعيين كلمات المرور
قبل أن تتمكن من استخدام الرابط، يتعين عليك إنشاء قالبين آخرين سيتم عرضهما أثناء عملية إعادة تعيين كلمة المرور:
registration/password_reset_confirm.htmlregistration/password_reset_complete.html
ابدأ بـ password_reset_confirm.html، والذي سيعرض نموذج إعادة تعيين كلمة المرور:
{% extends "base.html" %}
{% block content %}
<h2>Confirm password reset</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Confirm" />
</form>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
{% endblock content %}
بعد إرسال هذا النموذج، سيُعيد جانجو توجيهك إلى صفحة النجاح. قالب هذه الصفحة هو password_reset_complete.html:
{% extends "base.html" %}
{% block content %}
<h2>Password reset completed</h2>
<a href="{% url 'login' %}">Login</a>
{% endblock content %}
بعد أن أصبحت جميع القوالب جاهزة، انسخ رابط إعادة تعيين كلمة المرور من البريد الإلكتروني والصقه في متصفحك. يجب أن يكون نمط الرابط مثل accounts/reset///. تحتوي الصفحة التي ستظهر لك بعد زيارة رابط إعادة تعيين كلمة المرور على نموذج إعادة تعيين كلمة المرور.

بعد إدخال كلمة مرور جديدة والنقر على “تأكيد”، سيتم توجيهك إلى صفحة “password_reset_complete”. بعد ذلك، يمكنك تسجيل الدخول باستخدام كلمة المرور الجديدة.
إعادة تنشيط محقق كلمة المرور
في بداية هذا البرنامج التعليمي، قمتَ بتعطيل مُتحققات كلمات المرور في إعدادات مشروعك لتسهيل سير عمل التطوير. الآن، وبعد اكتمال نظام إدارة المستخدمين، حان الوقت لإعادة تفعيل مُتحققات كلمات المرور:
# ...
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
# ...
سيفرض Django الآن كلمات مرور قوية للمستخدمين الجدد. يمكنك الاطلاع على القواعد عند زيارة http://127.0.0.1:8000/accounts/password_change/ باستخدام مستخدم مسجل الدخول:

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