✅ الدرس 9: إنشاء نظام الإشعارات الداخلية (Notifications System)
🎯 أهداف الدرس
سننشئ نظام إشعارات احترافي داخل لوحة التحكم يشمل:
1.إنشاء إشعار تلقائي عند:- إضافة مستخدم
- تعديل مستخدم
- حذف مستخدم
3.عدّاد إشعارات غير مقروءة
4.تعليم الإشعار كمقروء
🧱 1️⃣ إنشاء Model الإشعارات
dashboard/models.py
from django.db import models
from django.contrib.auth.models import User
class Notification(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="notifications")
message = models.CharField(max_length=255)
is_read = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.message
تنفيذ الترحيل
python manage.py makemigrations
python manage.py migrate
🧱 2️⃣ إنشاء دالة مساعدة لإنشاء إشعار
dashboard/utils.py
from .models import Notification
from django.contrib.auth.models import User
def create_notification(message):
admins = User.objects.filter(is_staff=True)
for admin in admins:
Notification.objects.create(
user=admin,
message=message
)
🧱 3️⃣ ربط الإشعارات بالعمليات (Create – Edit – Delete)
مثال: عند إضافة مستخدم
dashboard/views.py
from .utils import create_notification
create_notification(f"تم إنشاء مستخدم جديد: {new_user.username}")
عند تعديل مستخدم
create_notification(f"تم تعديل بيانات المستخدم: {user.username}")
عند حذف مستخدم
create_notification(f"تم حذف المستخدم: {user.username}")
📌 ضع السطر المناسب داخل الـ view الخاصة بكل عملية
🧱 4️⃣ View عرض الإشعارات
dashboard/views.py
@login_required
@admin_required
def notifications(request):
notes = request.user.notifications.order_by("-created_at")
return render(request, "dashboard/notifications.html", {
"notes": notes
})
🧱 5️⃣ واجهة عرض الإشعارات
dashboard/templates/dashboard/notifications.html
{% extends "dashboard/base.html" %}
{% block content %}
<h3>الإشعارات</h3>
<ul class="list-group">
{% for note in notes %}
<li class="list-group-item d-flex justify-content-between
{% if not note.is_read %}list-group-item-warning{% endif %}">
{{ note.message }}
<small>{{ note.created_at|date:"Y-m-d H:i" }}</small>
</li>
{% empty %}
<li class="list-group-item">لا توجد إشعارات</li>
{% endfor %}
</ul>
{% endblock %}
🧱 6️⃣ عدّاد الإشعارات غير المقروءة (Badge)
dashboard/context_processors.py
def unread_notifications(request):
if request.user.is_authenticated:
return {
"unread_notifications":
request.user.notifications.filter(is_read=False).count()
}
return {}
تسجيله في settings.py
TEMPLATES = [
{
"OPTIONS": {
"context_processors": [
"dashboard.context_processors.unread_notifications",
],
},
},
]
🧱 7️⃣ عرض العدّاد في الـ Sidebar أو Navbar
base.html
<a href="{% url 'notifications' %}" class="nav-link">
الإشعارات
{% if unread_notifications > 0 %}
<span class="badge bg-danger">{{ unread_notifications }}</span>
{% endif %}
</a>
🧱 8️⃣ تعليم الإشعارات كمقروءة
dashboard/views.py
@login_required
def mark_notification_read(request, id):
note = Notification.objects.get(id=id, user=request.user)
note.is_read = True
note.save()
return redirect("notifications")
زر في الواجهة
<a href="{% url 'mark_notification_read' note.id %}" class="btn btn-sm btn-outline-success">
تم
</a>
🧪 ماذا أصبح لديك الآن؟
✅ نظام إشعارات حقيقي
✅ إشعارات تلقائية عند أي عملية
✅ عدّاد إشعارات غير مقروءة
✅ تصميم واضح ومرن
✅ جاهز للتوسعة (Realtime – Email – WebSocket)
🏁 الخلاصة
لوحة التحكم الخاصة بك الآن:
- تُراقب
- تُسجّل
- تُخطر
- تُدار باحتراف
وهي نفس البنية المستخدمة في الأنظمة الكبيرة 🔥

