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

🎸 شرح Django

نظام الرسائل السريعة (Messages Framework)

الدرس 31 من 34· ⏱ 2 دقائق قراءة· 🗓 آخر تحديث: ٢١ يوليو ٢٠٢٦

المشكلة التي يحلّها

بعد ما مستخدم يحفظ نموذجًا بنجاح، من العادة إعادة توجيهه لصفحة أخرى (نمط Post/Redirect/Get لمنع إعادة الإرسال بالخطأ عند تحديث الصفحة). لكن كيف تعرض له رسالة "تمّ الحفظ بنجاح" بعد إعادة التوجيه، مع أن الطلب الجديد لا يعرف شيئًا عن الطلب السابق؟ هذا بالضبط ما يحلّه Messages Framework — رسالة تُخزَّن مؤقّتًا وتُعرض مرة واحدة بالطلب التالي، ثم تُحذف تلقائيًا.

تفعيله (مفعّل افتراضيًا بمشاريع Django الجديدة)

# settings.py
INSTALLED_APPS = [
    ...
    "django.contrib.messages",
]

MIDDLEWARE = [
    ...
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
]

إضافة رسالة من View

from django.contrib import messages
from django.shortcuts import redirect

def save_post(request):
    # ... حفظ النموذج ...
    messages.success(request, "تمّ حفظ المنشور بنجاح!")
    return redirect("post-list")
الدالةالاستخدام
messages.success(request, text)عملية نجحت (حفظ، حذف، تسجيل)
messages.error(request, text)عملية فشلت
messages.warning(request, text)تحذير غير حرج
messages.info(request, text)معلومة عامة

عرضها بالقالب الأساسي

الأفضل عرضها بـ base.html مرة واحدة، فتظهر تلقائيًا فوق أي صفحة بالموقع:

{% if messages %}
  <ul class="messages">
    {% for message in messages %}
      <li class="{{ message.tags }}">{{ message }}</li>
    {% endfor %}
  </ul>
{% endif %}

message.tags يحمل اسم المستوى (success، error، warning، info) — استخدمه كـ class مباشرة بـ CSS لتلوين كل نوع رسالة بلونه.

أين تُخزَّن الرسالة؟

افتراضيًا، Django يخزّن الرسائل بالجلسة (session) وكوكيز معًا (fallback storage)، فتنجو حتى لو المستخدم غيّر متصفحه أثناء نفس الجلسة. يمكن تغيير التخزين عبر إعداد MESSAGE_STORAGE لو احتجت سلوكًا مختلفًا.

جدول سريع

العنصرالغرض
messages.success/error/warning/infoإضافة رسالة بمستوى محدّد داخل view
{{ messages }} بالقالبمتاحة تلقائيًا بأي قالب عبر context processor جاهز
message.tagsاسم مستوى الرسالة — يُستخدم كـ CSS class
MESSAGE_STORAGEإعداد اختياري لتغيير آلية التخزين

أخطاء شائعة

  • إضافة رسالة بـ view لا يُعقبه redirect() — الرسالة تبقى بالطابور وتظهر بأول صفحة تالية يزورها المستخدم، مما يسبّب ظهور رسالة قديمة بمكان غير متوقّع.
  • نسيان عرض {% if messages %} بقالب base.html المشترك، فتُكتب الرسالة من الـ view لكن لا تظهر أبدًا لأن القالب المحدّد لا يحتوي حلقة العرض.
  • الاعتماد على MessageMiddleware بدون SessionMiddleware مفعّلًا قبله بـ MIDDLEWARE — نظام الرسائل الافتراضي يعتمد على الجلسة.

🎯 التالي: الإشارات (Signals) — تنفيذ كود تلقائيًا عند أحداث النماذج.

شرح نظام الرسائل السريعة (Messages Framework) — Django بالعربي
نظام الرسائل السريعة (Messages Framework)Django بالعربي · The Code Fix

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

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