البرمجة

العمل مع استمارات جانغو

تطبيق عملي لتعلم جانغو – الجزء الثامن: العمل مع الاستمارات (Forms)

مقدمة

يُعد التعامل مع الاستمارات (Forms) أحد المكونات الجوهرية في تطوير تطبيقات الويب، إذ تتيح للمستخدمين التفاعل مع النظام، سواء عبر إرسال بيانات، أو تعديل محتوى، أو تنفيذ إجراءات معينة مثل التسجيل أو تسجيل الدخول. وفي إطار سلسلة “تطبيق عملي لتعلم جانغو”، يأتي الجزء الثامن للتركيز على الاستمارات في Django، باعتبارها أداة قوية ومتكاملة، توفّر أمانًا، تنظيمًا، ومرونة عالية لمعالجة مدخلات المستخدمين.

يوفر Django طبقة قوية ومتماسكة لإدارة الاستمارات باستخدام مكتبة django.forms، حيث يمكن إنشاء النماذج بسهولة وربطها بالنماذج (Models)، والتحقق من صحة البيانات (Validation)، وتوليد شيفرة HTML جاهزة، وكل ذلك بأسلوب موحد ومبني على المبادئ الأساسية لـ Django التي تقوم على “عدم التكرار” و”الوضوح”.


أهمية الاستمارات في تطبيقات الويب

تُعد الاستمارات الرابط المباشر بين المستخدم وقاعدة البيانات، فهي الوسيلة الأساسية لإدخال البيانات واسترجاعها، ومن دونها لا يمكن للتطبيق التفاعل مع المستخدم بصورة ديناميكية. وهي تستخدم في العديد من السياقات، مثل:

  • تسجيل حساب جديد

  • تسجيل الدخول

  • إرسال تعليقات أو رسائل

  • ملء استطلاعات أو استبيانات

  • تعديل البيانات الشخصية

  • رفع ملفات أو صور

كل هذه الاستخدامات تُدار من خلال بنية النماذج التي توفرها Django، مما يجعل فهمها والتعامل معها شرطًا أساسيًا لبناء تطبيقات احترافية.


أنواع الاستمارات في Django

في Django، يمكن التعامل مع نوعين رئيسيين من الاستمارات:

  1. Form العادية: وهي استمارات لا تعتمد على نموذج قاعدة بيانات (Model)، وإنما تُستخدم لإدخال بيانات مؤقتة أو غير محفوظة، أو للقيام بعمليات معينة (مثل البحث أو تسجيل الدخول).

  2. ModelForm: وهي استمارات تعتمد على نموذج معين من قاعدة البيانات، بحيث تُمثل الحقول تلقائيًا استنادًا إلى الحقول في النموذج المرتبط، مما يوفر الوقت والجهد ويقلل من التكرار.


إنشاء استمارة عادية باستخدام forms.Form

إنشاء ملف forms.py

أول خطوة عند العمل مع الاستمارات هي إنشاء ملف forms.py داخل التطبيق المراد التعامل معه.

python
# forms.py from django import forms class ContactForm(forms.Form): name = forms.CharField(max_length=100, label="الاسم") email = forms.EmailField(label="البريد الإلكتروني") message = forms.CharField(widget=forms.Textarea, label="الرسالة")

توضيح الحقول

  • CharField: يمثل حقلًا نصيًا بسيطًا.

  • EmailField: يتحقق من أن القيمة المُدخلة هي عنوان بريد إلكتروني صالح.

  • Textarea: عنصر HTML يُستخدم لنصوص متعددة الأسطر.


استخدام الاستمارة في العرض (View)

python
# views.py from django.shortcuts import render from .forms import ContactForm def contact_view(request): form = ContactForm() if request.method == "POST": form = ContactForm(request.POST) if form.is_valid(): name = form.cleaned_data['name'] email = form.cleaned_data['email'] message = form.cleaned_data['message'] # تنفيذ منطق المعالجة كإرسال بريد إلكتروني return render(request, 'contact.html', {'form': form})

إنشاء القالب (Template)

html
<form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">إرسالbutton> form>
  • {{ form.as_p }}: يعرض الحقول داخل فقرات

    .

  • {% csrf_token %}: عنصر أمان ضروري للحماية من هجمات CSRF.


إنشاء ModelForm

الآن لنفترض أننا نريد إنشاء استمارة مرتبطة بنموذج قاعدة بيانات.

نموذج قاعدة البيانات:

python
# models.py from django.db import models class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published_at = models.DateTimeField(auto_now_add=True)

استمارة ModelForm:

python
# forms.py from django import forms from .models import Article class ArticleForm(forms.ModelForm): class Meta: model = Article fields = ['title', 'content']

ميزة هذا النموذج هو أن الحقول تُستخلص تلقائيًا من نموذج قاعدة البيانات المرتبط.


استخدام ModelForm في العرض (View)

python
# views.py from .forms import ArticleForm def create_article(request): if request.method == 'POST': form = ArticleForm(request.POST) if form.is_valid(): form.save() else: form = ArticleForm() return render(request, 'article_form.html', {'form': form})

تخصيص الاستمارات

تخصيص التنسيق باستخدام widgets

python
class ContactForm(forms.Form): name = forms.CharField( widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'اكتب اسمك'}) )

تغيير التسمية والوصف

python
class ArticleForm(forms.ModelForm): class Meta: model = Article fields = ['title', 'content'] labels = { 'title': 'عنوان المقال', 'content': 'محتوى المقال' } help_texts = { 'title': 'يرجى إدخال عنوان مختصر وجذاب', }

التحقق من صحة البيانات (Validation)

Django يُوفر آلية قوية للتحقق من صحة البيانات.

باستخدام clean_()

python
class ContactForm(forms.Form): email = forms.EmailField() def clean_email(self): email = self.cleaned_data['email'] if "example.com" in email: raise forms.ValidationError("نطاق البريد هذا غير مسموح") return email

باستخدام clean()

python
class ContactForm(forms.Form): password = forms.CharField(widget=forms.PasswordInput) confirm_password = forms.CharField(widget=forms.PasswordInput) def clean(self): cleaned_data = super().clean() password = cleaned_data.get('password') confirm_password = cleaned_data.get('confirm_password') if password and confirm_password and password != confirm_password: raise forms.ValidationError("كلمتا المرور غير متطابقتين")

رفع الملفات باستخدام الاستمارات

تعديل النموذج لقبول ملفات

python
class DocumentForm(forms.Form): title = forms.CharField(max_length=100) file = forms.FileField()

تعديل القالب

html
<form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <button type="submit">رفعbutton> form>

ملاحظة: لا بد من استخدام enctype="multipart/form-data" في النماذج التي تتعامل مع ملفات.


مقارنة بين Form وModelForm

العنصر Form ModelForm
الاعتماد على النموذج لا تعتمد على قاعدة البيانات تعتمد على نموذج قاعدة بيانات محدد
التخصيص مرنة جدًا ومناسبة للتحكم الكامل أسرع وأسهل عند التعامل مع النماذج المرتبطة
الاستخدام الأمثل نماذج البحث أو التسجيل إنشاء وتحديث البيانات في قاعدة البيانات

نصائح عامة عند التعامل مع الاستمارات في Django

  • دائمًا تأكد من استخدام {% csrf_token %} في القوالب لتأمين الطلبات.

  • تحقق من صلاحية الاستمارة باستخدام form.is_valid() قبل محاولة حفظ أو استخدام البيانات.

  • نظّم ملفات forms.py إذا كنت تتعامل مع استمارات كثيرة عبر تقسيمها إلى وحدات.

  • استغل ميزة ModelForm لتقليل التكرار، خاصة مع النماذج المعقدة.

  • استخدم widgets لتخصيص الواجهة وتحسين تجربة المستخدم.

  • قم بتطبيق التحقق اليدوي في حال وجود شروط خاصة غير مدعومة مباشرة من Django.


الخلاصة

يوفّر Django نظام استمارات متكاملًا يُمكّن المطورين من إنشاء استمارات آمنة، قابلة للتخصيص، ومتوافقة مع معايير التطبيقات الحديثة. سواء كنت بصدد إنشاء نموذج اتصال بسيط أو واجهة معقدة لإدارة المحتوى، فإن django.forms و ModelForm يقدمان الأدوات الأساسية للقيام بذلك بكفاءة وسهولة. ومن خلال الاعتماد على بنية نموذجية واضحة، يمكن تبسيط عمليات الإدخال، التحقق من صحة البيانات، وربطها بقاعدة البيانات، بما يعزز من جودة وأمان التطبيق.


المراجع: