في هذا الدرس CRUD كامل للمستخدمين داخل Dashboard
(إضافة – تعديل – تعيين الأدوار – بدون Django Admin)
و هذا الدرس يجعل مشروعك احترافي 100% ومناسب لسوق العمل.
🎯 أهداف الدرس
بنهاية الدرس ستتمكن من:
- إضافة مستخدم جديد من الواجهة
- تعديل بيانات المستخدم
- تعيين الدور (Admin / Editor)
- حماية العمليات بالصلاحيات
- استخدام Bootstrap لتجربة مستخدم جميلة
🧱 هيكل الملفات الجديد
dashboard/
│── forms.py
│── views.py
│── urls.py
│── templates/
│ └── dashboard/
│ ├── user_form.html
│ └── users.html
🧠 1️⃣ إنشاء Form لإضافة وتعديل المستخدم
dashboard/forms.py
from django import forms
from django.contrib.auth.models import User, Group
class UserForm(forms.ModelForm):
role = forms.ModelChoiceField(
queryset=Group.objects.all(),
required=True,
label="الدور"
)
class Meta:
model = User
fields = ["username", "email", "is_active"]
def save(self, commit=True):
user = super().save(commit=False)
if commit:
user.save()
user.groups.clear()
user.groups.add(self.cleaned_data["role"])
return user
🧠 2️⃣ تحديث Views (Add + Edit)
dashboard/views.py
from .forms import UserForm
@login_required
@admin_required
def add_user(request):
form = UserForm(request.POST or None)
if form.is_valid():
user = form.save(commit=False)
user.set_password("123456")
user.save()
form.save_m2m()
messages.success(request, "تم إضافة المستخدم بنجاح")
return redirect("users")
return render(request, "dashboard/user_form.html", {"form": form})
@login_required
@admin_required
def edit_user(request, user_id):
user = get_object_or_404(User, id=user_id)
initial = {"role": user.groups.first()}
form = UserForm(request.POST or None, instance=user, initial=initial)
if form.is_valid():
form.save()
messages.success(request, "تم تحديث بيانات المستخدم")
return redirect("users")
return render(request, "dashboard/user_form.html", {"form": form})
🌐 3️⃣ تحديث URLs
dashboard/urls.py
path("add-user/", add_user, name="add_user"),
path("edit-user/<int:user_id>/", edit_user, name="edit_user"),
🎨 4️⃣ صفحة Form موحدة (إضافة + تعديل)
dashboard/user_form.html
{% extends "dashboard/base.html" %}
{% block content %}
<h3 class="mb-4">نموذج المستخدم</h3>
<form method="post" class="card p-4 shadow">
{% csrf_token %}
{{ form.as_p }}
<button class="btn btn-success mt-3">حفظ</button>
<a href="{% url 'users' %}" class="btn btn-secondary mt-3">رجوع</a>
</form>
{% endblock %}
👥 5️⃣ تحديث صفحة المستخدمين (زر إضافة + تعديل)
تعديل users.html
<a href="{% url 'add_user' %}" class="btn btn-primary mb-3">➕ إضافة مستخدم</a>
<td>
<a href="{% url 'edit_user' user.id %}" class="btn btn-warning btn-sm">تعديل</a>
<a href="{% url 'delete_user' user.id %}" class="btn btn-danger btn-sm">حذف</a>
</td>
🔐 حماية وأمان
✔ Admin فقط يستطيع الإضافة والتعديل
✔ Editor يرى فقط
✔ كلمة مرور افتراضية (يمكن تحسينها لاحقًا)
🧪 تمرين الدرس السادس
نفّذ التالي:
- إضافة اختيار كلمة المرور عند إنشاء المستخدم
- منع تعطيل حساب Admin الوحيد
- إضافة تأكيد عند تعديل الدور
✅ حل تمرين الدرس السادس (CRUD متقدم للمستخدمين)
✔ متطلبات التمرين التي سنحلّها:
- إضافة إدخال كلمة مرور عند إنشاء المستخدم
- منع تعطيل أو حذف آخر Admin
- تأكيد عند تغيير الدور (Role)
- الحفاظ على الحماية والصلاحيات
🧱 1️⃣ تحديث Form المستخدم (إضافة كلمة المرور)
dashboard/forms.py
from django import forms
from django.contrib.auth.models import User, Group
class UserForm(forms.ModelForm):
password = forms.CharField(
widget=forms.PasswordInput,
required=False,
label="كلمة المرور"
)
role = forms.ModelChoiceField(
queryset=Group.objects.all(),
required=True,
label="الدور"
)
class Meta:
model = User
fields = ["username", "email", "is_active"]
def save(self, commit=True):
user = super().save(commit=False)
if self.cleaned_data.get("password"):
user.set_password(self.cleaned_data["password"])
if commit:
user.save()
user.groups.clear()
user.groups.add(self.cleaned_data["role"])
return user
🧠 2️⃣ تحديث View إضافة المستخدم
dashboard/views.py
@login_required
@admin_required
def add_user(request):
form = UserForm(request.POST or None)
if form.is_valid():
user = form.save()
messages.success(request, "تم إنشاء المستخدم بنجاح")
return redirect("users")
return render(request, "dashboard/user_form.html", {"form": form})
🧠 3️⃣ تحديث View تعديل المستخدم (منع كسر النظام)
dashboard/views.py
@login_required
@admin_required
def edit_user(request, user_id):
user = get_object_or_404(User, id=user_id)
initial = {"role": user.groups.first()}
form = UserForm(request.POST or None, instance=user, initial=initial)
if form.is_valid():
new_role = form.cleaned_data["role"]
# منع إزالة آخر Admin
if user.groups.filter(name="Admin").exists():
admins_count = User.objects.filter(groups__name="Admin").count()
if admins_count == 1 and new_role.name != "Admin":
messages.error(request, "لا يمكن تغيير دور آخر Admin في النظام")
return redirect("users")
form.save()
messages.success(request, "تم تحديث بيانات المستخدم")
return redirect("users")
return render(request, "dashboard/user_form.html", {"form": form})
🛑 4️⃣ تحديث حذف المستخدم (منع حذف آخر Admin)
dashboard/views.py
@login_required
@admin_required
def delete_user(request, user_id):
user = get_object_or_404(User, id=user_id)
if user.groups.filter(name="Admin").exists():
admins_count = User.objects.filter(groups__name="Admin").count()
if admins_count == 1:
messages.error(request, "لا يمكن حذف آخر Admin في النظام")
return redirect("users")
user.delete()
messages.success(request, "تم حذف المستخدم")
return redirect("users")
🎨 5️⃣ تحسين الواجهة + تأكيد تغيير الدور
dashboard/user_form.html
{% extends "dashboard/base.html" %}
{% block content %}
<h3 class="mb-4">نموذج المستخدم</h3>
<form method="post" class="card p-4 shadow"
onsubmit="return confirm('هل أنت متأكد من حفظ التغييرات؟');">
{% csrf_token %}
{{ form.as_p }}
<button class="btn btn-success mt-3">حفظ</button>
<a href="{% url 'users' %}" class="btn btn-secondary mt-3">رجوع</a>
</form>
{% endblock %}
🔐 ما الذي تحقق الآن؟
✔ كلمة مرور آمنة
✔ حماية النظام من الانهيار
✔ منع أخطاء الصلاحيات
✔ CRUD احترافي كامل
✔ مشروع Django حقيقي 100%
🏁 الخلاصة
بهذا الدرس والتمرين:
- لم نعد نستخدم Django Admin
- لدينا Dashboard احترافي
- نظام أدوار وصلاحيات حقيقي
- جاهز للتوسعة (تقارير – إعدادات – Logs)

