تمهيد
إلى الآن، تعرّفنا على العديد من أساسيّات تطوير الويب باستعمال كلّ من إطار العمل Flask ومُحرّك القوالب Jinja، وفي الدّرس السّابق، تعرّفنا على ماهيّة الدّوال المُسبقة التّعريف في هذا الأخير، إذ تعرّفنا كبداية على كلّ من الدّالة range()
والدّالة lipsum
، وسنُكمل في هذا الدّرس ما بدأناه لنتعرّف على بقيّة الدّوال والأصناف المبنيّة مُسبقا في مُحرّك القوالب Jinja ليُساعدك ذلك على تطوير تطبيقات وِب أفضل.
الدّالة dict
في لغة بايثون، هناك نوع خاصّ من القيم يُسمّى القواميس Dictinaries، في كلّ قاموس نجد مفاتيح وقيّما لتُساعدنا على ترتيب البيانات وتسهيل البحث عن قيمة ما عبر مفتاحها، كما نستطيع الوصول إلى كلّ من القيم والمفاتيح باستعمال حلقة for
بسيطة.
في مُحرّك القوالب Jinja، القواميس مُشابهة لقواميس بايثون، إذ يُمكنك تعريف قاموس كما يلي:
{% set dictionary = {'1': 'One', '2': 'Two'} %}
في المثال أعلاه، كلّ من 1
و 2
عبارة عن مفاتيح، أمّا One
و Two
فهي قيم المفاتيح، بحيث One
قيمة المفتاح 1
و Two
قيمة المفتاح 2
.
للحصول على القيم في القاموس، يُمكن استخدام اسم المُتغيّر الذي يحمل القاموس مع المفاتيح كما يلي:
{{ dictionary['1'] }}
<br>
{{ dictionary['2'] }}
النّتيجة:
One
Two
مُلاحظة: في المثال أعلاه، قُمنا باستخدام الكلمة المفتاحيّة set
لتعريف مُتغيّر يحمل قاموسا كقيمة، لكن يُمكن كذلك أن تُمرّر مُتغيّرا يحمل قاموسا من ملفّات التّحكم – وهو الجزء الّذي يهتمّ به إطار العمل Flask - إلى قوالب HTML، لذا ففي هذه الحالة ستتمكّن من الوصول إلى القاموس مُباشرة من المُتغيّر دون تعريفه على نحو صريح باستعمال مُحرّك القوالب Jinja.
يُمكنك في مُحرّك القوالب Jinja إنشاء قواميس بطريقة أفضل عبر الاستعانة بالدّالة dict()
، إذ يُمكنك استعمال الدّالة لإنشاء قاموس تكون مفاتيحه هي أسماء المُعاملات وقيمة المُعامل هي نفسها قيمة المفتاح.
التّالي مثال على كيفيّة استخدام الدّالة dict()
لإنشاء قاموس بسيط:
dict(key='value', another_key='another value')
المثال أعلاه سيُنتج قاموسا كما يلي:
{'another_key': 'another value', 'key': 'value'}
تُستخدم القواميس عندما يكون لدينا نوع من القيم المُترابطة والتّي لها أصل واحد، فمثلا لنقل بأنّ القاموس يُمثّل بطاقة تعريف أحدهم، في القاموس سيتوجّب علينا تخزين الاسم الأوّل للشّخص، والاسم العائلي أو نسبُ نفس الشّخص.
المثال التّالي توضيح على كيفيّة استخدام الدّالة dict
لإنشاء قاموس يعمل على تخزين الاسم الكامل لشخص ما وعرض جملة ترحيبيّة مُخصّصة له:
{% set dictionary = dict(firstname='أحمد', lastname='علي') %}
مرحبا يا {{ dictionary['firstname'] }} {{ dictionary['lastname'] }}!
النّتيجة ستكون الجملة التّاليّة:
مرحبا يا أحمد علي!
وبالطّبع فالنّتيجة ستتغيّر كلّما غيّرت أحد قيمتي المُعاملين firstname
وlastname
أثناء استدعاء الدّالة dict
.
من الأمور المُميّزة في الدّالة dict
أنّها تُعطيك الحرّية في اختيار كيفيّة الوصول إلى قيمة كلّ مفتاح.
سابقا، استعملنا الطّريقة التّقليديّة للوصول إلى قيم القاموس كما يلي:
dictionary['firstname'] dictionary['lastname']
لكن يُمكننا كذلك الوصول إلى القيم بطريقة أسرع كما يلي:
dictionary.firstname
dictionary.lastname
بهذه الطّريقة يُمكنك اعتبار المفاتيح خصائص كما في خصائص الأصناف في لغة بايثون، ما يعني بأنّك تستطيع استخدام المُرشّحات والاختبارات التّي تسمح لك باختبار قيم الخصائص مُباشرة.
بالتّالي فالمثال السّابق سيكون كما يلي:
مرحبا يا {{ dictionary.firstname }} {{ dictionary.lastname }}!
ستُلاحظ بأنّ النّتيجة هي نفسها وبأنّ هذا المثال الأخير أفضل من المثال السّابق لأنّك تستطيع اختصار بعض الوقت عند الوصول إلى قيم المفاتيح بهذه الطّريقة.
الصّنف cycler
يُمكّنك الصّنف cycler من الدّوران حول مجموعة من العناصر بشكل لا نهائي، مع إمكانيّة إعادة الدّوران في وقت مُحدّد إن أردت ذلك.
على سبيل المثال، لنقل بأنّك تُريد الدّوران حول قائمة من الأسماء بشكل لا نهائي بحيث تُعاد الدّورة في كلّ مرّة.
لنضع الشّيفرة التّالية كمثال لكيفيّة استعمال الصّنف cycler
:
{% set names = cycler('Ahmed', 'Ali', 'Hassan') %}
في هذا المثال، أنشأنا كائنا من الصّنف cycler
وأسندناه إلى المُتغيّر names
.
يُمكننا الآن استخدام الكائن names
للدّوران حول قائمة الأسماء التّي مرّرناها إلى الصّنف cycler
.
من المُهم أن نفهم بأنّ الكائن names
سيحمل قيمة واحدة فقط في كلّ مرّة نستدعيه فيه باستخدام أحد توابع أو خصائص الصّنف cycler
، إذ يُمكننا استخدام الخاصيّة current
للحصول على القيمة الحاليّة، والتّابع next()
للوصول إلى القيمة التّاليّة، بالإضافة إلى التّابع reset()
لإعادة الدّوران من جديد والوصول إلى أول قيمة.
القيمة التي سيحملها الكائن names
عند استعمال أحد التّوابع ستكون أحد الأسماء في مجموعة الأسماء التّي حدّدناها من قبل فقط ولا يُمكن أن تكون قيمة أخرى.
الوصول إلى قيمة الدّوران الحاليّة
إن اعتبرنا المثال السّابق، فإنّنا نستطيع الوصول إلى قيمة الدّوران الحاليّة كما يلي:
{% set names = cycler('Ahmed', 'Ali', 'Hassan') %}
{{ names.current }}
وبما أنّنا لم نقم بأي انتقال من قيمة إلى الّتي تليها عبر التّابع next()
، فالقيمة البدئيّة ستكون أول عنصر من مجموعة العناصر المُمرّرة إلى الصّنف cycler
، أي الاسم Ahmed
في هذه الحالة.
الوصول إلى قيمة الدّوران التّاليّة
للوصول إلى القيمة التّاليّة وعرضها، يُمكنك استخدام التّابع next()
على الكائن names
كما يلي:
{{ names.next() }}
ستُلاحظ بأنّ النّتيجة هي نفسها النّتيجة التّي تظهر عند استخدام الخاصيّة current
أي أنّ القيمة التّي ظهرت هي العنصر الأول من قائمة العناصر.
هذا لأنّه يتوجّب علينا استخدام التّابع next()
أكثر من مرّة ليظهر مفعوله:
{{ names.next() }}
<br>
{{ names.next() }}
<br>
{{ names.next() }}
<br>
{{ names.next() }}
<br>
{{ names.next() }}
<br>
استخدمنا في المثال أعلاه التّابع next()
خمس مرّات، والنّتيجة كما المُتوقّع ستكون كالتّالي:
Ahmed
Ali
Hassan
Ahmed
Ali
كما تُلاحظ، عندما وصلت القيمة إلى آخر عنصر (أي الاسم Hassan
)، فقد عادت الدّورة إلى البداية من جديد لتستمرّ في الدّوران حول القيم، هذا يعني بأنّك تستطيع استخدام التّابع next()
لعدد لا نهائي من المرّات مع أي مجموعة من العناصر.
استخدام الصّنف cycler مع قائمة بايثون
بما أنّ الصّنف cycler
يعمل مع قيمٍ عدّة، فمن الطّبيعي أن ترغب في استخدامه مع قائمة عاديّة تحتوي على مجموعة من العناصر.
لكن إن مرّرت قائمة إلى الصّنف cylcer
كما يلي:
set names = cycler(['Ahmed', 'Ali', 'Hassan'])
فسيعتبر الصّنف هذه القائمة المُمرّرة مُجرّد قيمة واحدة، ولو استعملت مثلا التّابع next()
على القائمة مرّتين فستحصل على النّتيجة التّالية:
['Ahmed', 'Ali', 'Hassan']
['Ahmed', 'Ali', 'Hassan']
هذا يعني بأنّ الصّنف cycler
لا يعتبر القائمة مجموعة من العناصر كما يجب.
لحلّ هذه المُشكلة، استعمل الرّمز *
قبل القائمة لتفكيكها وتمرير كلّ عنصر منها على شكل مُعامل كما يلي:
set names = cycler(*['Ahmed', 'Ali', 'Hassan'])
هذه الطّريقة تعمل حتى لو كانت القائمة مُسندة إلى مُتغيّر ما كذلك، على سبيل المثال إن كانت لديك قائمة باسم list
وأردت تمرير عناصرها إلى الصّنف cycler
فيُمكنك ذلك كما يلي:
cycler(*list)
خاتمة
تعرّفنا في هذا الدّرس على كلّ من الدّالة dict
والصّنف cycler
لمُساعدتك على بناء صفحات HTML أفضل عند استعمال كلّ من إطار العمل Flask ومُحرّك القوالب Jinja، في الدّرس القادم سنتعرّف على جزء آخر لا يقلّ أهميّة عمّا درسناه في الدّروس السّابقة، ألا وهو كيفيّة التّعامل مع أكثر من ملفّ عبر تضمينها بعضها ببعض لتفادي تكرار الشّيفرة البرمجيّة.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.