أهم المرشحات المتوفرة بشكل قياسي في محرك القوالب Jinja – الجزء الثاني
محرك القوالب Jinja يُعتبر من أشهر وأقوى محركات القوالب في عالم تطوير الويب باستخدام لغة بايثون، وخاصة مع أطر العمل مثل Flask وDjango. واحدة من الميزات الأساسية التي تميز Jinja هي توفر مجموعة واسعة من المرشحات (Filters) التي تسمح للمطورين بمعالجة البيانات وتنسيقها بسهولة قبل عرضها ضمن القالب.
في المقال السابق تحدثنا عن بعض المرشحات الأساسية في Jinja، أما في هذا الجزء الثاني فسنستعرض بشمولية وتفصيل مرشحات قياسية أخرى مهمة للغاية، تساعد على تطوير قوالب متقدمة وذات أداء عالٍ مع إتاحة المزيد من الخيارات المرنة لمعالجة البيانات.
مرشح replace
يعتبر replace من المرشحات الشائعة التي تسمح باستبدال جزء من النص أو السلسلة النصية بآخر.
الصيغة العامة:
jinja{{ value | replace("old", "new") }}
هذا المرشح مفيد جداً في معالجة النصوص التي تحتاج إلى تعديل أو تحديث نصي معين بشكل سريع، مثل استبدال علامات أو كلمات داخل نص ديناميكي.
مرشح join
مرشح join من المرشحات المهمة للغاية عند التعامل مع القوائم (lists) أو المصفوفات.
هو يقوم بدمج عناصر القائمة في نص موحد مع وضع فاصل معين بين العناصر.
الصيغة:
jinja{{ list_variable | join(", ") }}
في المثال أعلاه، يتم دمج كل عناصر القائمة باستخدام فاصلة ومسافة كفاصل. يمكن استخدام أي فاصل آخر مثل - أو \n (سطر جديد) بحسب الحاجة.
مرشح random
هذا المرشح يستخدم لاختيار عنصر عشوائي من قائمة أو مجموعة بيانات.
الصيغة:
jinja{{ list_variable | random }}
يمكن أن يكون هذا المرشح مفيداً في الحالات التي تحتاج إلى عرض بيانات أو عناصر بشكل عشوائي في القالب، مثل اختيار صورة عشوائية، أو اقتباس، أو عنوان.
مرشح length
يرجع هذا المرشح طول النص أو عدد عناصر القائمة أو المصفوفة.
الصيغة:
jinja{{ variable | length }}
فمثلاً عند استخدامه على نص نصي، فإنه يُرجع عدد الأحرف، وعند استخدامه على قائمة يرجع عدد العناصر داخلها.
مرشح lower و upper
هما مرشحين يستخدمان لتحويل النصوص إلى أحرف صغيرة (lower) أو أحرف كبيرة (upper).
الصيغ:
jinja{{ variable | lower }} {{ variable | upper }}
تستخدم هذه المرشحات بكثرة عند الحاجة إلى توحيد تنسيق النصوص أو لتحسين قابلية البحث والفرز.
مرشح capitalize
يحول هذا المرشح أول حرف في النص إلى حرف كبير، مع جعل بقية الأحرف صغيرة.
الصيغة:
jinja{{ variable | capitalize }}
مثال:
إذا كانت القيمة “python programming”، فإن النتيجة ستكون “Python programming”.
مرشح title
يشبه مرشح capitalize لكنه يغير أول حرف من كل كلمة في النص إلى حرف كبير، مما يجعله مثالياً للعناوين والنصوص التي تحتاج إلى تنسيق رسمي.
الصيغة:
jinja{{ variable | title }}
مرشح default
من المرشحات المهمة جداً في التعامل مع القيم التي قد تكون None أو فارغة. يتيح هذا المرشح إعطاء قيمة بديلة إذا كانت القيمة الأساسية غير موجودة أو فارغة.
الصيغة:
jinja{{ variable | default("قيمة بديلة") }}
في حال كانت variable تحتوي على قيمة فارغة أو None سيتم استبدالها بالقيمة “قيمة بديلة”.
مرشح trim
يقوم هذا المرشح بإزالة الفراغات البيضاء من بداية ونهاية النص.
الصيغة:
jinja{{ variable | trim }}
يساعد هذا المرشح على تنقية النصوص المأخوذة من مصادر غير موثوقة أو بيانات المستخدم التي قد تحتوي على مسافات زائدة.
مرشح float و int
يستخدمان لتحويل القيم إلى نوع عددي معين.
الصيغ:
jinja{{ variable | float }} {{ variable | int }}
مرشح int يحول النص أو الرقم إلى عدد صحيح، بينما float يحول القيمة إلى رقم عشري.
مرشح round
يستخدم هذا المرشح لتقريب الأعداد العشرية إلى عدد محدد من الخانات العشرية.
الصيغة:
jinja{{ variable | round(2) }}
في المثال أعلاه يتم تقريب الرقم إلى خانتين عشريتين.
مرشح urlencode
يحول هذا المرشح النص إلى صيغة صالحة للاستخدام في عناوين URL عبر ترميز الأحرف الخاصة.
الصيغة:
jinja{{ variable | urlencode }}
يُستخدم بشكل شائع عند إنشاء روابط تحتوي على بيانات يتم تمريرها عبر GET Parameters.
مرشح safe
واحد من أهم المرشحات التي تتيح عرض النصوص HTML كما هي دون ترميز أو تعطيل HTML فيها، ما يعني أنه يسمح بعرض المحتوى بشكل آمن (بحسب اعتقاد المبرمج).
الصيغة:
jinja{{ variable | safe }}
يجب توخي الحذر عند استخدام هذا المرشح لأنه قد يعرض الموقع لهجمات XSS إذا كان المحتوى غير موثوق.
مرشح escape
عكس مرشح safe، فهو يقوم بتحويل الأحرف الخاصة إلى رموز HTML لكي يتم عرضها كنصوص وليس كعناصر HTML.
الصيغة:
jinja{{ variable | escape }}
يستخدم لضمان أن أي نص يحتوي على رموز HTML يظهر نصياً بدون أن تتفاعل المتصفحات معها.
مرشح replace
يتيح هذا المرشح استبدال نص معين بنص آخر داخل سلسلة نصية.
الصيغة:
jinja{{ variable | replace("نص_قديم", "نص_جديد") }}
تكرر ذكره لأنه مهم جداً في معالجة النصوص ديناميكياً داخل القوالب.
مرشح dictsort
يساعد هذا المرشح في فرز القوائم التي تحتوي على قواميس (dictionaries) حسب مفتاح معين داخل القاموس.
الصيغة:
jinja{{ list_of_dicts | dictsort("key_name") }}
ينتج قائمة مرتبة حسب القيمة المرتبطة بالمفتاح المحدد.
مرشح groupby
يمكن استخدامه لتجميع عناصر قائمة حسب قيمة مفتاح معين، وينتج قائمة من المجموعات.
الصيغة:
jinja{{ list_of_dicts | groupby("key_name") }}
هذا المرشح مفيد لتصنيف وعرض البيانات في القوالب بشكل منظم.
مرشح first و last
هما مرشحين بسيطين يستخدمان للحصول على أول عنصر أو آخر عنصر من قائمة أو نص.
الصيغ:
jinja{{ list_variable | first }} {{ list_variable | last }}
يساعدان في الوصول السريع إلى العناصر دون الحاجة لكتابة حلقات معقدة.
مرشح reverse
يعكس ترتيب عناصر القائمة أو النص.
الصيغة:
jinja{{ list_variable | reverse }}
يساعد في عرض البيانات بترتيب عكسي عند الحاجة.
مرشح slice
يقسم القائمة إلى شرائح أصغر بناءً على عدد العناصر في كل شريحة.
الصيغة:
jinja{{ list_variable | slice(3) }}
يقسم القائمة إلى مجموعات من 3 عناصر لكل شريحة، ويساعد في تصميم تخطيطات شبكية أو أعمدة.
مرشح sum
يقوم بجمع كل العناصر الرقمية في القائمة وإرجاع المجموع.
الصيغة:
jinja{{ list_variable | sum }}
مفيد جداً في العمليات الحسابية على البيانات المرسلة إلى القالب.
جدول يوضح بعض المرشحات مع وصف مختصر وصيغة الاستخدام
| اسم المرشح | الوصف | الصيغة |
|---|---|---|
| replace | استبدال نص داخل سلسلة | `{{ value |
| join | دمج عناصر القائمة مع فاصل | `{{ list |
| random | اختيار عنصر عشوائي من قائمة | `{{ list |
| length | حساب طول النص أو عدد العناصر | `{{ variable |
| lower | تحويل النص إلى أحرف صغيرة | `{{ variable |
| upper | تحويل النص إلى أحرف كبيرة | `{{ variable |
| capitalize | تحويل أول حرف كبير فقط | `{{ variable |
| title | تحويل أول حرف من كل كلمة كبير | `{{ variable |
| default | تعيين قيمة بديلة إذا كانت فارغة | `{{ variable |
| trim | إزالة الفراغات من بداية ونهاية | `{{ variable |
| float | تحويل إلى رقم عشري | `{{ variable |
| int | تحويل إلى عدد صحيح | `{{ variable |
| round | تقريب رقم إلى عدد من الخانات | `{{ variable |
| urlencode | ترميز نص لاستخدامه في عنوان URL | `{{ variable |
| safe | عرض النص كـ HTML دون ترميز | `{{ variable |
| escape | ترميز الأحرف الخاصة في HTML | `{{ variable |
| dictsort | فرز قائمة قواميس حسب مفتاح | `{{ list |
| groupby | تجميع قائمة حسب مفتاح | `{{ list |
| first | أول عنصر في القائمة | `{{ list |
| last | آخر عنصر في القائمة | `{{ list |
| reverse | عكس ترتيب القائمة | `{{ list |
| slice | تقسيم القائمة إلى شرائح | `{{ list |
| sum | جمع عناصر القائمة الرقمية | `{{ list |
أهمية معرفة المرشحات في Jinja
المرشحات هي حجر الأساس في عملية التلاعب بالبيانات داخل قوالب Jinja، إذ تمكّن المبرمجين من تطبيق عمليات معالجة متعددة على البيانات بدون الحاجة لتعديل البيانات نفسها في طبقة التطبيق. هذه المرونة تقلل من الحاجة لإضافة تعقيد في كود بايثون، وتتيح فصل واضح بين منطق التطبيق وطبقة العرض، وهو من أهم مبادئ هندسة البرمجيات.
باستخدام هذه المرشحات يمكن عرض البيانات بشكل أنيق وموحد، وتحسين تجربة المستخدم، وكذلك تحسين أداء التطبيق عبر تقليل المعالجات الحسابية على الخادم.
نصائح عملية للاستفادة من المرشحات
-
تسلسل المرشحات: يمكن تطبيق عدة مرشحات متتالية على نفس المتغير، مثل:
jinja{{ variable | lower | replace("a", "@") | trim }}هذا يعطي تحكمًا دقيقاً في تحويل النصوص.
-
تجنب الحسابات الثقيلة داخل القوالب: رغم قوة المرشحات، إلا أن العمليات الحسابية أو المنطقية الثقيلة يجب أن تبقى في الكود الخلفي (backend) وليس في القالب.
-
الاهتمام بالأمان: عند التعامل مع محتوى HTML أو مدخلات المستخدم، يجب استخدام مرشحات مثل
escapeوsafeبحذر لتجنب هجمات XSS. -
تحسين الأداء: بعض المرشحات مثل
randomأوgroupbyقد تكون مكلفة حسابياً على مجموعات بيانات كبيرة، فيفضل تحضير البيانات مسبقاً إذا كان ذلك ممكناً.
الخلاصة
محرك القوالب Jinja يقدم مكتبة قياسية غنية من المرشحات التي تتيح للمطورين تنسيق وعرض البيانات بسهولة ومرونة. هذه المرشحات تتنوع بين النصوص، القوائم، الأعداد، وحتى التعامل مع المحتوى الآمن. معرفة هذه المرشحات واستخدامها بشكل مدروس يوفر وقت وجهد كبيرين ويضمن أن القوالب التي تكتبها ستكون أكثر كفاءة وقابلة للصيانة.
بالإضافة إلى ما تم استعراضه في هذا المقال، فإن Jinja يدعم إنشاء مرشحات مخصصة تسمح لك بتوسيع وظائف القالب حسب احتياجات المشروع. ولكن البدء بفهم المرشحات القياسية هو الخطوة الأساسية نحو تطوير قوالب قوية ومرنة.
المصادر والمراجع
-
الوثائق الرسمية لمحرك القوالب Jinja:
https://jinja.palletsprojects.com/en/latest/templates/#filters -
كتاب “Flask Web Development” لمطور Flask ميغيل غرينبرغ (Miguel Grinberg)
هذا المقال يركز على الجانب العملي والوظيفي لمجموعة المرشحات الأساسية في محرك القوالب Jinja، مما يمكن المطورين من تحسين جودة وأداء قوالبهم بشكل كبير.

