بعض من أهم الاختبارات المُتوفّرة في مُحرّك القوالب Jinja
يُعدّ مُحرّك القوالب Jinja أحد أقوى وأشهر محركات القوالب المستخدمة في بيئة Python، خاصة في تطبيقات الويب المعتمدة على إطار العمل Flask وDjango (عبر تكامل غير مباشر). يتميز Jinja بقدرته العالية على توليد محتوى HTML ديناميكي من خلال قوالب مُنظمة ومدمجة مع منطق برمجي محدود، ما يجعل الكود أكثر نظافة، وأسهل في الصيانة، ويعزز الفصل بين منطق التطبيق ومظهره.
من أبرز أدوات Jinja التي تُستخدم ضمن القوالب هي الاختبارات (Tests). توفر Jinja مجموعة من الاختبارات الجاهزة التي تُستخدم للتحقق من نوع القيم، خصائصها، أو تحقق شروط معينة داخل التعبيرات الشرطية. هذه الاختبارات تُستخدم غالبًا مع عبارة if وتُقدَّم بواسطة الكلمة المحجوزة is.
أهمية الاختبارات (Tests) في Jinja
توفر الاختبارات في Jinja طبقة إضافية من الذكاء داخل القوالب، حيث يمكن استخدامها لاتخاذ قرارات أثناء توليد المحتوى. على سبيل المثال، يُمكن عبرها التحقق مما إذا كانت القيمة سلسلة نصية، أو قائمة، أو رقم، أو حتى None. كما يمكن من خلالها اختبار التفريغ، أو التساوي، أو التحقق من تواجد عنصر ضمن مجموعة، أو مطابقة نمط معين.
البنية العامة لاستخدام الاختبارات
يتم استخدام الاختبارات ضمن الشيفرة في قوالب Jinja باستخدام الصيغة التالية:
jinja{% if variable is test_name %} {% endif %}
بعض الاختبارات تقبل وسائط إضافية:
jinja{% if variable is test_name(argument) %} {% endif %}
أهم الاختبارات في Jinja
فيما يلي عرض موسّع لأبرز الاختبارات المتوفّرة في محرك Jinja، مع توضيح وظيفتها وأمثلة عملية على استخدامها:
1. defined
الوظيفة: يُستخدم للتحقق مما إذا كانت المتغيرات معرفة في السياق.
مثال:
jinja{% if username is defined %}مرحبا {{ username }}
{% endif %}
الفائدة: تجنب الأخطاء الناتجة عن استخدام متغيرات غير معرفة.
2. undefined
الوظيفة: عكس defined؛ يتحقق مما إذا كان المتغير غير معرف.
مثال:
jinja{% if user_age is undefined %}العمر غير محدد
{% endif %}
3. none
الوظيفة: يتحقق مما إذا كانت القيمة None (أي لا تحتوي على شيء).
مثال:
jinja{% if profile_picture is none %}{% endif %}
4. number
الوظيفة: يتحقق مما إذا كانت القيمة رقمية (عدد صحيح أو عشري).
مثال:
jinja{% if score is number %}النتيجة: {{ score }}
{% endif %}
5. string
الوظيفة: يتحقق مما إذا كانت القيمة سلسلة نصية (String).
مثال:
jinja{% if name is string %}الاسم: {{ name }}
{% endif %}
6. sequence
الوظيفة: يتحقق مما إذا كانت القيمة تمثل تسلسلاً مثل قائمة أو سلسلة.
مثال:
jinja{% if items is sequence %}{% for item in items %}
{% endif %}- {{ item }}
{% endfor %}
7. mapping
الوظيفة: يتحقق مما إذا كانت القيمة تمثل قاموسًا (dictionary).
مثال:
jinja{% if user_data is mapping %}اسم المستخدم: {{ user_data.username }}
{% endif %}
8. iterable
الوظيفة: يتحقق مما إذا كانت القيمة قابلة للتكرار (مثل قائمة أو سلسلة أو قاموس).
مثال:
jinja{% if values is iterable %} {% for val in values %}{{ val }}
{% endfor %} {% endif %}
9. callable
الوظيفة: يتحقق مما إذا كانت القيمة قابلة للاستدعاء (مثل دالة).
مثال:
jinja{% if func is callable %} {{ func() }} {% endif %}
10. divisibleby
الوظيفة: يتحقق مما إذا كانت القيمة تقبل القسمة على رقم معين بدون باقي.
مثال:
jinja{% if num is divisibleby(3) %}{{ num }} يقبل القسمة على 3
{% endif %}
11. even / odd
الوظيفة: even يتحقق من كون الرقم زوجي، وodd يتحقق من كونه فردي.
مثال:
jinja{% if number is even %}{{ number }} هو عدد زوجي
{% endif %} {% if number is odd %}{{ number }} هو عدد فردي
{% endif %}
12. equalto
الوظيفة: يتحقق مما إذا كانت القيمة مساوية لقيمة معينة.
مثال:
jinja{% if status is equalto("success") %}تمت العملية بنجاح
{% endif %}
13. greaterthan / lessthan
الوظيفة: يقارن ما إذا كانت القيمة أكبر أو أصغر من قيمة محددة.
مثال:
jinja{% if age is greaterthan(18) %}مرحبًا بك، أنت بالغ
{% endif %}
14. sameas
الوظيفة: يتحقق من تطابق الكائنات (identical references).
مثال:
jinja{% if obj1 is sameas(obj2) %}الكائنان متماثلان
{% endif %}
15. lower / upper
الوظيفة: يتحقق مما إذا كانت السلسلة نصية مكتوبة بأحرف صغيرة أو كبيرة بالكامل.
مثال:
jinja{% if name is lower %}الاسم مكتوب بأحرف صغيرة
{% endif %}
16. startingwith / endingwith
الوظيفة: يتحقق مما إذا كانت السلسلة تبدأ أو تنتهي بقيمة معينة.
مثال:
jinja{% if filename is endingwith(".jpg") %}{% endif %}
جدول مقارن لأهم الاختبارات
| اسم الاختبار | الوظيفة | أمثلة على الاستخدام |
|---|---|---|
defined |
يتحقق من وجود المتغير | {% if var is defined %} |
none |
يتحقق إن كانت القيمة None |
{% if var is none %} |
string |
يتحقق إن كانت القيمة سلسلة نصية | {% if name is string %} |
number |
يتحقق إن كانت القيمة رقمية | {% if age is number %} |
sequence |
يتحقق من كون القيمة تسلسل | {% if items is sequence %} |
divisibleby(n) |
يتحقق من القابلية للقسمة | {% if count is divisibleby(2) %} |
even / odd |
يتحقق من الزوجية أو الفردية | {% if num is even %} |
equalto(value) |
يتحقق من المساواة لقيمة | {% if status is equalto("ok") %} |
callable |
يتحقق من قابلية الاستدعاء | {% if func is callable %} |
sameas(value) |
يتحقق من التطابق الكامل بين كائنين | {% if var is sameas(another_var) %} |
lower / upper |
يتحقق من حالة الحروف في النص | {% if word is upper %} |
أهمية الاختبارات في كتابة قوالب نظيفة وآمنة
تكمن أهمية هذه الاختبارات في كونها تساهم بشكل مباشر في كتابة قوالب:
-
أكثر وضوحًا وتنظيمًا: عبر تقليل التحقق من القيم في منطق التطبيق وجعل القالب أكثر استقلالية.
-
أكثر أمنًا: حيث يتم التأكد من وجود القيم وأنواعها قبل استخدامها.
-
أكثر مرونة: يمكن إعادة استخدام القوالب مع متغيرات مختلفة من دون تعديل كبير.
الخاتمة
الاختبارات في Jinja تُعد أدوات أساسية ضمن القوالب، تُستخدم للتحقق من القيم واتخاذ قرارات منطقية مباشرة أثناء إنشاء المحتوى الديناميكي. بفضل تنوعها وسهولة دمجها في بنية القوالب، تمكّن المطور من كتابة صفحات ديناميكية دقيقة وآمنة، ذات أداء محسّن وقابلية عالية للصيانة.
إن فهم هذه الاختبارات واستخدامها بشكل صحيح يُعد خطوة ضرورية لكل مطور يستخدم Jinja، ويضمن إنتاج تطبيقات ويب ذات جودة عالية على مستوى العرض والمنطق.
المراجع:
-
The Jinja Documentation — https://jinja.palletsprojects.com/en/latest/templates/#list-of-builtin-tests
-
Flask Official Documentation — https://flask.palletsprojects.com/en/latest/

{% endif %}
