تطبيق عملي لتعلم جانغو – الجزء الثامن: العمل مع الاستمارات (Forms)
مقدمة
يُعد التعامل مع الاستمارات (Forms) أحد المكونات الجوهرية في تطوير تطبيقات الويب، إذ تتيح للمستخدمين التفاعل مع النظام، سواء عبر إرسال بيانات، أو تعديل محتوى، أو تنفيذ إجراءات معينة مثل التسجيل أو تسجيل الدخول. وفي إطار سلسلة “تطبيق عملي لتعلم جانغو”، يأتي الجزء الثامن للتركيز على الاستمارات في Django، باعتبارها أداة قوية ومتكاملة، توفّر أمانًا، تنظيمًا، ومرونة عالية لمعالجة مدخلات المستخدمين.
يوفر Django طبقة قوية ومتماسكة لإدارة الاستمارات باستخدام مكتبة django.forms، حيث يمكن إنشاء النماذج بسهولة وربطها بالنماذج (Models)، والتحقق من صحة البيانات (Validation)، وتوليد شيفرة HTML جاهزة، وكل ذلك بأسلوب موحد ومبني على المبادئ الأساسية لـ Django التي تقوم على “عدم التكرار” و”الوضوح”.
أهمية الاستمارات في تطبيقات الويب
تُعد الاستمارات الرابط المباشر بين المستخدم وقاعدة البيانات، فهي الوسيلة الأساسية لإدخال البيانات واسترجاعها، ومن دونها لا يمكن للتطبيق التفاعل مع المستخدم بصورة ديناميكية. وهي تستخدم في العديد من السياقات، مثل:
-
تسجيل حساب جديد
-
تسجيل الدخول
-
إرسال تعليقات أو رسائل
-
ملء استطلاعات أو استبيانات
-
تعديل البيانات الشخصية
-
رفع ملفات أو صور
كل هذه الاستخدامات تُدار من خلال بنية النماذج التي توفرها Django، مما يجعل فهمها والتعامل معها شرطًا أساسيًا لبناء تطبيقات احترافية.
أنواع الاستمارات في Django
في Django، يمكن التعامل مع نوعين رئيسيين من الاستمارات:
-
Form العادية: وهي استمارات لا تعتمد على نموذج قاعدة بيانات (Model)، وإنما تُستخدم لإدخال بيانات مؤقتة أو غير محفوظة، أو للقيام بعمليات معينة (مثل البحث أو تسجيل الدخول).
-
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
pythonclass ContactForm(forms.Form):
name = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'اكتب اسمك'})
)
تغيير التسمية والوصف
pythonclass ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content']
labels = {
'title': 'عنوان المقال',
'content': 'محتوى المقال'
}
help_texts = {
'title': 'يرجى إدخال عنوان مختصر وجذاب',
}
التحقق من صحة البيانات (Validation)
Django يُوفر آلية قوية للتحقق من صحة البيانات.
باستخدام clean_()
pythonclass 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()
pythonclass 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("كلمتا المرور غير متطابقتين")
رفع الملفات باستخدام الاستمارات
تعديل النموذج لقبول ملفات
pythonclass 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 يقدمان الأدوات الأساسية للقيام بذلك بكفاءة وسهولة. ومن خلال الاعتماد على بنية نموذجية واضحة، يمكن تبسيط عمليات الإدخال، التحقق من صحة البيانات، وربطها بقاعدة البيانات، بما يعزز من جودة وأمان التطبيق.
المراجع:

