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

🎸 شرح Django

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

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

عروض المصادقة الجاهزة

Django يأتي بمجموعة عروض جاهزة كاملة لإعادة تعيين كلمة المرور — لا تحتاج كتابة منطق التحقق من الرمز أو صلاحيته يدويًا:

# urls.py
from django.contrib.auth import views as auth_views

urlpatterns = [
    path("password_reset/", auth_views.PasswordResetView.as_view(
        template_name="accounts/password_reset.html"
    ), name="password_reset"),
    path("password_reset/done/", auth_views.PasswordResetDoneView.as_view(
        template_name="accounts/password_reset_done.html"
    ), name="password_reset_done"),
    path("reset/<uidb64>/<token>/", auth_views.PasswordResetConfirmView.as_view(
        template_name="accounts/password_reset_confirm.html"
    ), name="password_reset_confirm"),
    path("reset/done/", auth_views.PasswordResetCompleteView.as_view(
        template_name="accounts/password_reset_complete.html"
    ), name="password_reset_complete"),
]

رحلة المستخدم الكاملة

1. المستخدم يزور /password_reset/ ويُدخل بريده
2. Django يُنشئ رمزًا آمنًا مؤقّتًا ويرسل رابط إعادة التعيين بالبريد
3. المستخدم يضغط الرابط (uidb64 + token مشفّرين بالرابط نفسه)
4. Django يتحقق من صلاحية الرمز، ويعرض نموذج كلمة مرور جديدة
5. بعد الحفظ، الرمز يُبطَّل تلقائيًا (استخدام واحد فقط)

قالب طلب إعادة التعيين

{# accounts/password_reset.html #}
{% extends "base.html" %}
{% block content %}
<h2>نسيت كلمة المرور؟</h2>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">أرسل رابط إعادة التعيين</button>
</form>
{% endblock %}

إعداد إرسال البريد

بدون إعداد EMAIL_BACKEND، Django يطبع الرسائل بالـ terminal فقط — ممتاز للتطوير المحلي:

# settings.py — وضع التطوير (لا يُرسل بريدًا فعليًا)
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"

للإنتاج، تحتاج خادم SMTP حقيقي:

# settings.py — وضع الإنتاج
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.sendgrid.net"  # أو أي مزوّد (Mailgun, SES, Gmail)
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = env("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = env("EMAIL_HOST_PASSWORD")
DEFAULT_FROM_EMAIL = "no-reply@thecodefix.net"

استخدم دائمًا متغيّرات بيئة (environment variables) لكلمات مرور البريد — لا تكتبها مباشرة بالكود أبدًا.

إرسال بريد يدويًا من أي مكان بالكود

from django.core.mail import send_mail

send_mail(
    subject="مرحبًا بك في The Code Fix",
    message="شكرًا لتسجيلك معنا!",
    from_email="no-reply@thecodefix.net",
    recipient_list=[user.email],
    fail_silently=False,
)

تغيير كلمة المرور (وأنت مسجّل دخول أصلًا)

مختلف عن "نسيت كلمة المرور" — هذا لمستخدم مسجّل دخول يريد تغييرها طوعًا:

path("password_change/", auth_views.PasswordChangeView.as_view(
    template_name="accounts/password_change.html"
), name="password_change"),
path("password_change/done/", auth_views.PasswordChangeDoneView.as_view(
    template_name="accounts/password_change_done.html"
), name="password_change_done"),

جدول سريع

العرض الجاهزالغرض
PasswordResetViewنموذج إدخال البريد وإرسال رابط إعادة التعيين
PasswordResetConfirmViewنموذج كلمة المرور الجديدة بعد الضغط على الرابط
PasswordChangeViewتغيير كلمة المرور لمستخدم مسجّل دخول أصلًا
EMAIL_BACKEND (console)يطبع الرسائل بالـ terminal — للتطوير فقط
EMAIL_BACKEND (smtp)يرسل بريدًا حقيقيًا — للإنتاج

أخطاء شائعة

  • نسيان تفعيل EMAIL_BACKEND بالإنتاج والاعتماد على وضع console الافتراضي — المستخدمون لن يستلموا أي بريد فعليًا.
  • كتابة كلمة مرور البريد مباشرة بملف settings.py بدل متغيّر بيئة — خطر أمني حقيقي إذا رُفع الكود لمستودع عام.
  • نسيان روابط urls.py الأربعة معًا — الرحلة الكاملة تحتاج كل الأربعة متّصلة ببعضها بشكل صحيح.

🎯 التالي: كتابة اختبارات آلية لتطبيق Django — نماذج وعروض ونماذج إدخال.

شرح إعادة تعيين كلمة المرور وإرسال البريد — Django بالعربي
إعادة تعيين كلمة المرور وإرسال البريدDjango بالعربي · The Code Fix

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

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