تصور کنید وبسایتی طراحی کردهاید که قرار است به کاربران مختلف، پیامهای متفاوتی نمایش دهد؛ مثلاً به مدیر سایت عبارت “خوش آمدید ادمین” را نشان دهد و برای کاربران عادی، محتوای دیگری را به تصویر بکشد. HTML به تنهایی یک زبان استاتیک است و توانایی درک این تفاوتها را ندارد. اینجاست که جنگو (Django) با معرفی ابزارهای قدرتمندی به نام «تگها» و «فیلترها» وارد میدان میشود. این ابزارها به ما اجازه میدهند به صفحات بیروح HTML، هوش و پویایی تزریق کنیم و بر اساس دادههای موجود، چیدمان سایت را در لحظه تغییر دهیم. در واقع، این تگها و فیلترها هستند که مرز میان یک صفحه ساده و یک وباپلیکیشن حرفهای را تعیین میکنند.
نکته اول: تگ if؛ هوشمندسازی صفحات بر اساس منطق کاربر
تگ if یکی از اساسیترین ابزارهای کنترلی در جنگو است که اجازه میدهد منطق برنامهنویسی را مستقیماً وارد ساختار HTML کنیم. با استفاده از این تگ، میتوان نمایش بخشهای مختلف صفحه را مشروط کرد. این قابلیت نهتنها برای بهبود تجربه کاربری (UX) ضروری است، بلکه از جنبه امنیتی نیز اهمیت دارد؛ چرا که میتوان محتوای حساس را فقط به افراد مجاز نمایش داد.
ساختار کلی این تگ با {% if %} شروع شده و با {% endif %} خاتمه مییابد:
{% if name == 'admin' %}
<p>You are Admin</p>
{% endif %}
در این مثال، عبارت داخل تگ تنها زمانی نمایش داده میشود که متغیر نام برابر با “admin” باشد. به قول معروف:
“Django یک فریم ورک وب است که به راه های ساده جهت ایجاد HTML پویا نیاز دارد.”
نکته دوم: قدرت ارثبری با extends و block؛ پایان تکرارهای خستهکننده
یکی از چالشهای بزرگ در توسعه وب، تکرار کدهای مشابه (مانند هدر، فوتر و سایدبار) در تمام صفحات است. جنگو با استفاده از تگهای extends و block مفهوم “ارثبری تمپلیت” را معرفی کرده است. این رویکرد دقیقاً مطابق با اصل DRY (تکرار نکردن کد) است.
شما یک فایل پایه (مثلاً base.html) میسازید و بخشهای متغیر را با block مشخص میکنید:
فایل base.html:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}My amazing site{% endblock %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul><li><a href="/">Home</a></li></ul>
{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
سپس در صفحات فرزند، با استفاده از extends آن ساختار را به ارث میبرید و فقط محتوای بلوکهای خاص را تغییر میدهید:
فایل child.html:
{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block content %}
<h2>Welcome to my blog!</h2>
{% endblock %}
نکته سوم: تگ url؛ خداحافظی با آدرسهای سختگیرانه (Hardcoded)
نوشتن آدرسهای مستقیم (مانند /contact-us/) در کدهای HTML کار پرخطری است؛ زیرا با کوچکترین تغییر در ساختار آدرسها در فایل urls.py تمام لینکهای سایت شما از کار میافتند. تگ url این مشکل را با آدرسدهی پویا حل میکند.
به جای نوشتن مستقیم مسیر، کافی است نام الگو (view_name) را به تگ بدهید: <a href="{% url 'app_name:view_name' %}">Link to View</a>
با این کار، جنگو به صورت خودکار مسیر واقعی URL را جایگزین میکند. این یعنی نگهداری سایت در آینده بسیار آسانتر خواهد بود، زیرا آدرسها فقط در یک نقطه (تنظیمات URL) مدیریت میشوند.
نکته چهارم: فیلترهای هوشمند؛ زیبایی در جزئیات نمایش
فیلترها وظیفه تغییر نمایش متغیرها را بر عهده دارند تا دادههای خام به شکلی کاربرپسند ارائه شوند. دو فیلتر بسیار حیاتی برای ظاهر سایت عبارتند از:
• فیلتر date: این فیلتر تاریخهای سیستم را به فرمتهای خوانا تبدیل میکند. برای مثال با کد {{ value|date:"D d M Y" }} خروجی به صورت Wed 01 Jan 2025 نمایش داده میشود.
◦ پارامترهای پرکاربرد:
• فیلتر truncatechars: این فیلتر برای تمیز نگه داشتن ظاهر سایت در باکسهای خبری یا لیستها عالی است. اگر متنی طولانی باشد، آن را کوتاه کرده و علامت “…” قرار میدهد.
◦ مثال: اگر مقدار متغیر “Joel is a dog” باشد، استفاده از {{ value|truncatechars:7 }} خروجی را به صورت “Joel i…” نمایش میدهد.
نکته پنجم: فیلتر default؛ مدیریت حرفهای فیلدهای خالی
در دنیای واقعی، دادهها همیشه کامل نیستند. ممکن است کاربری بیوگرافی خود را خالی گذاشته باشد یا فیلدی در پایگاه داده مقدار None یا رشته خالی داشته باشد. نمایش یک فضای خالی یا واژه “None” در سایت، ظاهر آن را غیرحرفهای میکند. فیلتر default راهکار جنگو برای این چالش است:
{{ user.bio|default:"No bio available" }}
این ابزار کوچک تضمین میکند که سایت شما همیشه پر و صیقلخورده به نظر برسد، حتی زمانی که دادهای برای نمایش وجود ندارد.
گام بعدی در مسیر توسعهدهنده حرفهای
درک عمیق تگها و فیلترهای جنگو، کلید طلایی برای ساختاردهی به اطلاعات و ایجاد رابط کاربری منعطف است. این ابزارها به شما اجازه میدهند بدون درگیر شدن با پیچیدگیهای لایه منطق (Backend) در زمان طراحی قالب، کنترل کاملی بر نحوه ارائه دادهها داشته باشید.
در جدول های زیر تمپلیت تگ ها و فیلتر های جنگو همراه با توضیحات نوشته شده که امکان درک و استفاده رو براتون به خوبی فراهم میکنه:
| نام فیلتر | توضیحات |
|---|---|
| add | یک مقدار مشخص را اضافه میکند. [۱] |
| addslashes | قبل از کاراکترهای کوتیشن (quote)، بکاسلش اضافه میکند تا رشتهها Escape شوند. [۱] |
| capfirst | اولین حرف رشته را بزرگ میکند. [۱] |
| center | مقدار را در مرکز یک عرض مشخص قرار میدهد. [۱] |
| cut | کاراکتر یا عبارت مشخص شده را حذف میکند. [۱] |
| date | تاریخ را با فرمت مشخص شده برمیگرداند. [۱] |
| default | اگر مقدار False باشد، یک مقدار پیشفرض را برمیگرداند. [۱] |
| default_if_none | اگر مقدار None باشد، یک مقدار پیشفرض را برمیگرداند. [۱] |
| dictsort | یک دیکشنری را بر اساس مقدار داده شده مرتب میکند. [۱] |
| divisibleby | اگر مقدار بر عدد مشخص شده بخشپذیر باشد، True برمیگرداند. [۱] |
| escape | کدهای HTML را از یک رشته Escape میکند. [۱] |
| filesizeformat | یک عدد را به فرمت اندازه فایل (مثلاً KB, MB) تبدیل میکند. [۱] |
| first | اولین آیتم یک شیء را برمیگرداند. [۱] |
| floatformat | اعداد اعشاری را تا تعداد مشخصی رقم اعشار گرد میکند. [۱] |
| join | آیتمهای یک لیست را به یک رشته تبدیل میکند. [۱] |
| last | آخرین آیتم یک شیء را برمیگرداند. [۱] |
| length | تعداد آیتمهای یک شیء یا تعداد کاراکترهای یک رشته را برمیگرداند. [۱] |
| lower | تمام حروف متن را به حروف کوچک تبدیل میکند. [۱] |
| make_list | یک مقدار را به یک شیء لیست تبدیل میکند. [۱] |
| pluralize | اگر مقدار عددی ۱ نباشد، یک ‘s’ به انتهای کلمه اضافه میکند. [۱] |
| random | یک آیتم تصادفی از یک شیء را برمیگرداند. [۱] |
| safe | متن را به عنوان متنی امن علامتگذاری میکند که نباید HTML آن Escape شود. [۱] |
| slugify | متن را به یک عبارت مناسب برای آدرس (Slug) تبدیل میکند (حروف کوچک و خط تیره). [۱] |
| striptags | تگهای HTML را از متن حذف میکند. [۱] |
| time | زمان را با فرمت مشخص شده برمیگرداند. [۱] |
| title | حرف اول هر کلمه را بزرگ و بقیه را کوچک میکند. [۱] |
| truncatechars | رشته را تا تعداد مشخصی کاراکتر کوتاه میکند. [۱] |
| truncatewords | رشته را تا تعداد مشخصی کلمه کوتاه میکند. [۱] |
| upper | تمام حروف متن را به حروف بزرگ تبدیل میکند. [۱] |
| wordcount | تعداد کلمات موجود در یک متن را برمیگرداند. [۱] |
| yesno | مقادیر منطقی (Boolean) را به مقادیر مشخص شده تبدیل میکند. [۱] |
| نام تگ | توضیحات |
|---|---|
| autoescape | مشخص میکند که آیا حالت autoescape (فرار خودکار کاراکترها) فعال باشد یا خیر. [۱] |
| block | یک بخش بلوک (Block) را برای ارثبری در قالبها تعریف میکند. [۱] |
| comment | یک بخش توضیحات (Comment) را مشخص میکند که در خروجی نمایش داده نمیشود. [۱] |
| csrf_token | از فرمها در برابر حملات Cross Site Request Forgeries محافظت میکند. [۱] |
| cycle | محتوایی را برای استفاده در هر چرخه از یک حلقه مشخص میکند. [۱] |
| debug | اطلاعات مربوط به خطایابی (Debugging) را نمایش میدهد. [۱] |
| extends | یک قالب والد (Parent Template) را برای ارثبری مشخص میکند. [۱] |
| filter | محتوا را قبل از بازگرداندن، فیلتر میکند. [۱] |
| firstof | اولین متغیری که خالی نیست را برمیگرداند. [۱] |
| for | یک حلقه for را برای پیمایش تعریف میکند. [۱] |
| if | یک دستور شرطی if را مشخص میکند. [۱] |
| ifchanged | در حلقهها استفاده میشود و تنها در صورتی یک بلوک را خروجی میدهد که مقدار آن نسبت به تکرار قبلی تغییر کرده باشد. [۱] |
| include | یک قالب یا محتوای خارجی را در قالب فعلی بارگذاری میکند. [۱] |
| load | تگهای قالب را از یک کتابخانه دیگر بارگذاری میکند. [۱] |
| lorem | متنهای تصادفی (مانند Lorem Ipsum) تولید میکند. [۱] |
| now | تاریخ یا زمان فعلی را در خروجی نمایش میدهد. [۱] |
| regroup | یک لیست از اشیاء را بر اساس یک ویژگی مشترک گروهبندی میکند. [۱] |
| resetcycle | در چرخهها (cycles) استفاده میشود و چرخه را به حالت اول برمیگرداند. [۱] |
| spaceless | فواصل خالی (Whitespace) بین تگهای HTML را حذف میکند. [۱] |
| templatetag | یک تگ قالب مشخص شده را به عنوان خروجی برمیگرداند. [۱] |
| url | بخش مربوط به آدرس مطلق (URL) را برمیگرداند. [۱] |
| verbatim | محتویاتی را مشخص میکند که نباید توسط موتور قالب پردازش یا رندر شوند. [۱] |
| widthratio | یک مقدار عرض را بر اساس نسبت بین یک مقدار داده شده و حداکثر مقدار محاسبه میکند. [۱] |
| with | یک متغیر را برای استفاده در داخل یک بلوک مشخص تعریف میکند. [۱] |
سوال تاملبرانگیز: به نظر شما کدام یک از این ابزارها میتواند بیشترین زمان را در پروژه بعدی شما صرفهجویی کند: مدیریت هوشمند منطقهای شرطی با تگ if یا استفاده از ساختار قدرتمند ارثبری تمپلیتها؟
Discuss This Article with the Community
Have a question, a different approach, or something you built after reading this? Share it on the forum or join the Discord, we'd love to hear from you.