بخش های اصلی

آموزش Django

Django – سیستم Template

Digango این امکان را فراهم میکنه تا python و HTML از هم جدا بشن، python در viewها استفاده میشه و HTML در templateها. Django، برای ایجاد لینک بین این دو، متکی بر تابعِ render و زبانِ Django Template است.

تابعِ Render

این تابع سه پارامتر می گیره  -

  •  Request – درخواستِ اولیه.
  •  مسیر مربوط به template - مسیر نسبی به آپشنِ TEMPLATE_DIRS در متغیرهای settings.py مربوط به پروژه ست.
  • دایرکتوری پارامترها – یک دایرکتوری که شامل تمام متغیرهای مورد نیازِ template است. می توانید این متغیر را ایجاد کنید یا می توانید برای پاس دادن تمام متغیرهای محلی تعریف شده در view از locals() استفاده کنین.

زبانِ Django Template (DTL)

موتورِ template مربوط به Django، برای تعریف لایه ی user-facting در برنامه، یک mini-language ارائه میده.

نمایش متغیرها

یک متغیر شبیه به {{variable}} است. template، متغیر را با متغیری که در سومین پارامترِ تابعِ render، توسطِ view فرستاده شده، جایگزین می کنه. در ادامه hello.html را با نمایشِ تاریخ امروز، عوض می کنیم –

hello.html

<html>
   
   <body>
      Hello World!!!<p>Today is {{today}}</p>
   </body>
   
</html>

بعد از انجام تغییرات، view باید به شکل زیر بشه:

def hello(request):
   today = datetime.datetime.now().date()
   return render(request, "hello.html", {"today" : today})

اکنون اگه به URL/myapp/hello برین، خروجی به شکل زیر خواهید دید -  

Hello World!!!
Today is Sept. 11, 2015

همانطور که مشاهده کردین، اگه متغیر string نباشه، Django برای نمایش آن از متدِ __str__ استفاده می کنه؛ می توانید با استفاده از همین قاعده، به همان روشی که در python نیز این کار را انجام میدین، به خصیصه ی (attribute) مربوط به شیء، دسترسی پیدا کنین. برای مثال: اگه بخواین سال را نمایش بدین، متغیر بصورتِ {{today.year}} خواهد بود.

فیلترها

فیلترها به شما کمک می کنن تا متغیرها را هنگام نمایش تغییر بدین. ساختار فیلترها شبیه به {{var|filters}} است.

مثال :

  • {{string|truncatewords:80}} – این فیلتر قسمتی از string را حذف می کنه، بنابراین فقط 80 کلمه ی اول آن را خواهید دید.
  • {{string|lower}} – حروفِ string را به حروف کوچک تبدیل می کنه.
  • {{string|escape|linebreaks}} –  محتوایِ string را تغییر میده، بنابراین line breaks (خط های جدید) تبدیل به تگ میشن.

می توانید برای متغیر، پیش فرض را هم تعیین کنین.

تگ ها

تگ ها این امکان را به شما میدن تا این عملیات را اجرا کنین: شرطِ if، حلقه ی for، وراثتِ template و ...

تگِ if

مثل Python، می توانید در template از if، else و elif استفاده کنین –

<html>
   <body>
   
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
   </body>
</html>

در این template جدید، template، یک مقدار قطعی را بر اساس تاریخِ روز، رِندِر می کنه.

تگِ  for

مثلِ ‘if’، تگِ ‘for’ هم دقیقاً مثلِ Python عمل می کنه. در ادامه viewای با نام hello را برای انتقال یک لیست به template تغییر میدیم –

def hello(request):
   today = datetime.datetime.now().date()
   
   daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
   return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})

templateای که این لیست را نمایش میده، از {{for}} استفاده می کنه –

<html>
   <body>
      
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
      <p>
         {% for day in days_of_week %}
         {{day}}
      </p>
		
      {% endfor %}
      
   </body>
</html>

باید خروجی کد بالا بصورت زیر باشه –

Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun

تگ هایِ Block و Extend

سیستمِ template بدونِ وراثتِ template، کامل نمیشه. یعنی باید هنگامی که templateها را طراحی می کنین، یک template اصلی به همراه حفره هایی داشته باشین که فرزندهایِ template بر اساس نیازِ template (برای مثال وقتی که احتمال داشته باشه که صفحه برای زبانه ی انتخاب شده اش به css خاصی نیاز پیدا کنه)، این حفره ها را پر کنن.

در ادامه templateای به نامِ hello.html را طوری تغییر میدیم تا از main_template.html ارث بری کنه.

main_template.html

<html>
   <head>
      
      <title>
         {% block title %}Page Title{% endblock %}
      </title>
      
   </head>
	
   <body>
   
      {% block content %}
         Body content
      {% endblock %}
      
   </body>
</html>

hello.html

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

در مثال بالا، هنوز هم با فراخوانیِ /myapp/hello خروجی ای مثل قبل دریافت می کنین تنها تفاوت این است که در این مثال برای ایجادِ کدِ ساعت، از extends و block استفاده کرده ایم-

در main_template.html، blockها را با استفاده از تگِ block تعریف کرده ایم. عنوانِ block همان عنوان صفحه خواهد بود و محتوایِ block همان محتوای صفحه خواهد بود. در home.html، برای ارث بری از main_template.html از extends استفاده کرده ایم و بعد blockای که در بالا تعریف کردیم را پر کرده ایم (محتوا و عنوان).

تگِ Comment

این تگ کمک می کنه تا به template، توضیحاتی را اضافه کنیم، البته منظور توضیحات (comment) HTML نیست، این توضیحات در صفحه ی HTML ظاهر نمی شن بلکه برای داکیومنتِ پروژه یا برای توضیح دادن راجع یه یکی از خط های کد استفاده میشن.

در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش Django

Learn Django

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

تبلیغات

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد