عروض المصادقة الجاهزة
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 — نماذج وعروض ونماذج إدخال.