Django - Şablon Sistemi

Django, python ve HTML'yi ayırmayı mümkün kılar, python görünümlere gider ve HTML şablonlara gider. İkisini birbirine bağlamak için Django, render işlevine ve Django Şablon diline güvenir.

Render İşlevi

Bu işlev üç parametre alır -

  • Request - İlk istek.

  • The path to the template - Bu, proje settings.py değişkenlerindeki TEMPLATE_DIRS seçeneğine göre yoldur.

  • Dictionary of parameters- Şablonda gerekli tüm değişkenleri içeren bir sözlük. Bu değişken oluşturulabilir veya görünümde bildirilen tüm yerel değişkeni geçirmek için locals () kullanabilirsiniz.

Django Şablon Dili (DTL)

Django'nun şablon motoru, uygulamanın kullanıcıya dönük katmanını tanımlamak için mini bir dil sunar.

Değişkenleri Görüntüleme

Bir değişken şuna benzer: {{değişken}}. Şablon, değişkeni, render işlevinin üçüncü parametresinde görünüm tarafından gönderilen değişkenle değiştirir. Bugünün tarihini görüntülemek için merhaba.html’imizi değiştirelim -

hello.html

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

Sonra görüşümüz şu şekilde değişecek -

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

Şimdi URL / uygulamam / merhaba URL'sine eriştikten sonra aşağıdaki çıktıyı alacağız -

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

Muhtemelen fark ettiğiniz gibi, değişken bir dizge değilse, Django onu görüntülemek için __str__ yöntemini kullanacaktır; ve aynı ilkeyle, tıpkı Python'da yaptığınız gibi bir nesne özelliğine erişebilirsiniz. Örneğin: tarih yılını görüntülemek istersek, değişkenim şöyle olur: {{bugün.yıl}}.

Filtreler

Değişkenleri görüntüleme zamanında değiştirmenize yardımcı olurlar. Filtrelerin yapısı şuna benzer: {{var | filtreler}}.

Some examples -

  • {{string|truncatewords:80}} - Bu filtre dizeyi kesecek, böylece yalnızca ilk 80 kelimeyi göreceksiniz.

  • {{string|lower}} - Dizeyi küçük harfe dönüştürür.

  • {{string|escape|linebreaks}} - Dize içeriklerinden kaçar, ardından satır sonlarını etiketlere dönüştürür.

Bir değişken için varsayılanı da ayarlayabilirsiniz.

Etiketler

Etiketler şu işlemleri gerçekleştirmenizi sağlar: if koşulu, for döngüsü, şablon devralma ve daha fazlası.

Eğer etiketle

Tıpkı Python'da olduğu gibi şablonunuzda if, else ve elif kullanabilirsiniz -

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

Bu yeni şablonda günün tarihine bağlı olarak şablon belirli bir değer oluşturacaktır.

Etiket

Tıpkı 'if' gibi, tıpkı Python'daki gibi çalışan 'for' etiketine sahibiz. Şablonumuza bir liste göndermek için merhaba görünümümüzü değiştirelim -

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})

Bu listeyi {{for}} kullanarak görüntülemek için şablon -

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

Ve şöyle bir şey almalıyız -

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

Etiketleri Engelle ve Genişlet

Bir şablon sistemi, şablon mirası olmadan tamamlanamaz. Yani, şablonlarınızı tasarlarken, bir sayfanın seçilen sekme için özel bir css'e ihtiyacı olabileceği gibi, çocuğun şablonunun kendi ihtiyacına göre dolduracağı delikleri olan bir ana şablonunuz olmalıdır.

Hello.html şablonunu main_template.html'den miras alacak şekilde değiştirelim.

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.day == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

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

{% endfor %}
{% endblock %}

Yukarıdaki örnekte, / myapp / merhaba çağrısında yine de aynı sonucu alacağız ama şimdi kodumuzu yeniden düzenlemek için extends ve block'a güveniyoruz -

Main_template.html'de etiket bloğunu kullanarak blokları tanımlıyoruz. Başlık bloğu, sayfa başlığını içerecektir ve içerik bloğu, sayfa ana içeriğine sahip olacaktır. Home.html'de main_template.html'den miras almak için extends kullanırız ve ardından yukarıda tanımlanan bloğu (içerik ve başlık) doldururuz.

Yorum Etiketi

Yorum etiketi, yorumların HTML yorumlarına değil şablonlara tanımlanmasına yardımcı olur, HTML sayfasında görünmezler. Dokümantasyon için veya sadece bir kod satırına yorum yapmak için yararlı olabilir.