توضیح Template filter در Django

در اینجا به بررسی دلبری Template Filters در Django می‌پردازیم. چی‌ان؟ کی‌ان؟ آمدن‌شون بهر چه بود؟می‌دونیم که Django با یه Template Engine همراهه. که خب خیلی کار‌ رو راحت کرده! reusability و این داستانا. دلبریشون با فراهم کردن امکاناتی مثل TEMPLATE FILTERS و TEMPLATE TAGS بیشتر هم کرده. ما به کمک این امکانات می‌تونیم یک سری عملیاتی که خیلی رایج هستن و احتمالا هر وب اپلیکیشن داینامیکی ازشون استفاده می‌کنه رو پیاده کنیم. مثل: نمایش فقط بخشی از یک متغیر که به Template ارسال شده، نمایش یه لیست، override کردن محتوا در یک block خاصی از template.ما در این قسمت قراره از Template filters استفاده کنیم و یاد بگیریم که چجوری template filter خودمون رو بسازیم. در قسمت بعدی می‌ریم سراغ Template tags که نسبت به filters منعطف‌ترن و امکانات بیشتری در اختیارتون می‌ذارن.تصور کنین می‌خوایم در پنل کاربری، بخش "درخواست‌های من" مثلا، به کاربر بگیم که چندبار درخواست غذا(یا هر order) دادی! خب چیکار می‌کنیم؟ هیچ‌کاری، اینجا بحث view و model نیست خودتون انجامش بدین :Dدر viewیی که قراره اون پنل رو render کنه، می‌تونین کوئری بزنین و هرجا یوزر order برابر اون request.user بود، QuerySet رو برگردونه. در نهایت می‌شه یه متغیر مثلا: users_order_length به context اضافه کرد و سمت template که بهش دسترسی داری، نمایشش بدی.اما ما به هر‌حال که لیست درخواست‌هارو که داریم؟ خب چرا دوباره بیایم کوئری بزنیم و متغیر بفرستیم و نمایش بدیم؟ از یه template filter استفاده کنیم.You've submited {{ orders|length }} ordersاینجا نمی‌شه از همه‌ی Template Filterها نام برد و استفاده کرد doc رو بخونین و استفاده کنین.بهتره بریم سراغ ساخت یک Template Filterجنگو یه سری API سریع، آسان، انقلابی در اختیارمون گذاشته که باهاش به راحتی می‌شه یک function رو decorate کرد و به عنوان یک custom template filter ثبتش کرد.خب!from django import template register = template.Library()ما یک instance از template می‌خوایم که بعدا بتونیم مطابق کد زیر از filter استفاده کنیم:@register.filter def my_custom_template_filter(...): ...یه سری مرحله داره:ما باید یک پوشه در اپلیکیشن‌ بسازیم به اسم: templatetags (به اصطلاح به این می‌گن app level directory). Django موقع load کرد هر application می‌ره این directory رو نگاه می‌کنه. اگه فیلتری بود، load می‌کنه.قدم بعدی، ساخت یه فایله که فیلتر‌هامون رو اونجا بنویسیم: custom_template_filters.pyداخل فایلی که ساختیم همون کارای قبلی رو انجام بدیم و یه instance از templates بگیریم:from django import template register = template.Library()کاستوم فیلتر‌ها چیزی نیستن جز یه function که یه سری پارامتر دریافت می‌کنن:یکیش: value. این گزینه حتما باید دریاف بشه و اجباریه.دومیش: هر پارامتر دیگه‌ای، یعنی اصلا این گزینه لازم نیست و کاملا option است.خب بریم یه دونه بسازیمfrom django import template register = template.Library() @register.filter def separate_names(value, separator): return value.split(separator)خب، حالا که ساختیم چجوری بیایم داخل template خودمون ازش استفاده کنیم؟اولا فیلتر‌هایی که ساختیم رو باید load کنیم. پس داخل template با دستور زیر load میکنیمشون:{% load custom_template_filters %}بعدش که load شد. می‌تونین مثل بقیه‌ی filterها ازش استفاده کنین.from django.shortcuts import renderdef get_orders(request): food_names = &quotGhormeSabzi,Kabab,Ash &quot return render(request, &quotorders.html&quot, {&quotfood_names&quot: food_names})خب، اینجا مثلا ما یه سری value داریم که به template پاس می‌دیم که اون‌طرف از template filterی که ساختیم استفاده کنیم.در template داریم:<html> <head> <title>Showing off my custom filter </title> </head> <body> {% load custom_template_filters %} {{ food_names|separate_names:&quot,&quot}} </body> </html>نتیجه این خواهد بود: [&quotGhormeSabzi&quot, &quotKabab&quot, &quotAsh&quot]من یه بار برای encode کردن مقدار یک object که به template ارسال می‌شدن استفاده کردم:import string from django import template register = template.Library() @register.filter(name=&quotencode&quot) def encode(value): ALPHABET = string.ascii_uppercase ALPHABET_DICT = dict((i, c) for (i, c) in enumerate(ALPHABET)) result = &quot&quot for i in str(value): result += ALPHABET_DICT[int(i)] return resultاحتمال زیاد قسمت بعدی بریم سراغ Decoratorها یا Template Tags.کم و کاستی‌هارو به بزرگی خودتون ببخشید.