متغیرها – Variables


همان‌طور که گفته شد، متغیرها در جنگو، داخل {{ }} قرار می‌گیرند و برای انتقال داده‌ها به قالب‌ها (templates) و نمایش محتوای پویا به کار می‌روند. برای استفاده از متغیرها باید ابتدا مقادیر موردنظر را در تابع view تعریف کرده و سپس آن‌ها را به قالب ارسال کنیم. به‌عنوان مثال، فرض کنیم در مسیر articles/ می‌خواهیم لیستی از مقالات به همراه سطح تخصص هر مقاله (عددی بین ۱ تا ۳) را به قالب بفرستیم. در نهایت، این داده‌ها در قالب طوری نمایش داده می‌شوند که سطح تخصص هر مقاله از آسان تا سخت مشخص شود.

ابتدا در فایل views.py به تابع مختص URL رفته و متغیر مربوطه را ایجاد می‌کنیم:


coreapp/views.py

def articlesList(request):
  title = 'Artificial Intelligence'
  difficulty = 3
  context = {'article':title, 'level': difficulty}
  return render(request, 'articles.html', context)

 سپس به فایل تمپلیت articles.html رفته و متغیرها را در ساختار تمپلیت استفاده می‌کنیم:

coreapp/templates/articles.html

{% extends "base.html" %}
{% block title %} {{block.super}} | Articles {% endblock title %}
{% block content %}
  <h1> Article Title: {{ article }} </h1>
  <p> Article Level: 
    {% if level == 1 %}
      <b>Easy</b>
    {% elif level == 2 %}
      <b>Normal</b>
    {% else %}
      <b>Hard</b>
    {% endif %}
  </p>
{% endblock %}

همانگونه که در کد فوق قابل مشاهده می­‌باشد، ابتدا داده‌های عنوان (title) و درجه سختی (difficulty) در تابع articleList() در views برای مقاله تعریف شده و سپس به‌ترتیب توسط متغیرهای article و level به تمپلیت برای ارائه در رابط کاربری انتقال داده شدند. برای دسترسی به مقادیر این متغیرها در تمپلیت، کافیست از {{ title }} و همچنین {{ level }}  استفاده کنیم

در صورتی‌که از متغیر در داخل تگ تمپلیت {% %} استفاده می‌کنیم، دیگر نیازی به استفاده از {{ }} نخواهد بود.

درنهایت با تعریف الگوی URL برای درخواست، می‌توان فرآیند را تکمیل نمود:

coreapp/urls.py

urlpatterns = [
    path('articles/', views.articlesList, name='Articles'),
]

حال در مرورگر، اگر آدرس 127.0.0.1:8000/articles/ وارد کنیم، تصویر ذیل را مشاهده خواهیم کرد.

حال اگر فرض بگیریم لیستی از مقاله‌­ها داشته باشیم که به‌­صورت دیکشنری تعریف شده‌­اند (دیکشنری­‌ها برای ذخیره مقادیر داده به‌­صورت آرایه­‌های key:value استفاده می­شوند) و بخواهیم مقالات را در مسیر آدرس  articles/ لیست کنیم، تعریف تابع مربوطه در views.py به این صورت خواهد شد

coreapp/views.py

def articlesList(request):
  ArticlesDictionary = [
      {'id': '1', 'title': 'Artifical Intelligence', 'level': 3},
      {'id': '2', 'title': 'Sport', 'level': 1},
      {'id': '3', 'title': 'Nature', 'level': 2},
    ]
  context = {'articles':ArticlesDictionary}
  return render(request, 'articles.html', context)

و تمپلیت مربوطه بدین صورت تغییر شکل خواهد داد:


coreapp/templates/articles.html

{% extends "base.html" %}
{% block title %} {{block.super}} | Articles {% endblock title %}
{% block content %}
<h1> Articles List: </h1>
<ul>
  {% for article in articles %}
  <li><b>{{ article.title }}</b> - <small>Difficulty Level: {{ article.level }} </small></li>
  {% endfor %}
</ul>
{% endblock %}

 اگر دوباره وارد آدرس زیر articles/ شویم، در مرورگر تصویر ذیل را مشاهده خواهیم کرد