Back-end/Python

[Python]Django Template Languages 장고 템플릿 언어

cheersHena 2018. 4. 1. 17:06
반응형

Django 템플릿 언어

템플릿의 변수는 템플릿이 평가될때 값으로 대치되며 태그는 템플릿의 로직을 제어한다.


{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}


변수 {{ variable }}


템플릿 엔진이 변수를 만나면 결과로 치환. {{ 변수이름.속성 }} 

e.g {{section.title}} 


필터 : 변수의 표시에 변화 . {{ 변수|필터}} 

e.g {{story.headline|upper}} 대문자로 출력.

{{ list|join:", " }} list를 쉼표과 공백으로 join.

- for instance;

default

변수가 false 또는 비어 있는 경우, 지정된 defalut를 사용

{{ value|default:"nothing" }}

value가 제공되지 않았거나 비어 있는 경우, 위에서는 “nothing“을 출력.

length

값의 길이를 반환합니다. 문자열과 목록에 대하여 사용할 수 있습니다. 예:

{{ value|length }}

value가 ['a', 'b', 'c', 'd']라면, 결과는 4.

striptags

S모든 [X]HTML 태그를 제거. 

{{ value|striptags }}

value가 "<b>Joel</b> <button>is</button> a <span>slug</span>"인 경우, 결과는 "Joel is a slug".


※ 내장필터 reference 또는 직접 만들수 있음.

http://django-doc-test-kor.readthedocs.io/en/old_master/ref/templates/builtins.html#ref-templates-builtins-filters



태그 {% tag %}


텍스트 생성, 루프 혹은 로직 수행 등.


-for instance;


for
반복 루프. 예를 들어, athlete_list 리스트의 모든 name 속성을 출력.

<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>


if and else

변수가 “true”이면 블록의 컨텐츠를 표시

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% else %}
    No athletes.
{% endif %}

athlete_list가 비어있지 않다면, {{ athlete_list|length }} 변수에 의하여 선수의 숫자 출력.

또한 if 태그 내에 필터 및 각종 연산자 사 가능.

{% if athlete_list|length > 1 %} Team: {% for athlete in athlete_list %} ... {% endfor %} {% else %} Athlete: {{ athlete_list.0.name }} {% endif %}



주석 {# #}

주석은 다음과 같이 템플릿 코드가 유효하든 아니든 간에 포함시킬 수 있음.

{# {% if foo %}bar{% else %} #}

단, 이 구문은 단일 행 주석에만 사용가능.

템플릿 상속

상속을 통해 사이트에서 공통부분을 가진 기초 골격 템플릿(base.html)만들고, 자식 템플릿이 덮어쓰게 될 block 정의한다. 

base.html (부모 Template)

<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}My amazing site{% endblock %}</title> <!--자식템플릿이 덮어쓸 title--> </head> <body> <div id="sidebar"> <!--자식템플릿이 덮어쓸 sidebar--> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %}<!--자식템플릿이 덮어쓸 contents--> </div> </body> </html>

base템플릿 즉, 기본골격이 될 부모 템플릿의 비어있는 블록의 content를 채우는 것은 자식 템플릿이 할 일이다.

block태그 : 템플릿 엔진에게 자식 템플릿이 그 부분을 덮어 쓸 것이라고 알려줌.


example.html (자식 Template)

{% extends "base.html" %}  <!--부모템플릿 상속(확장)-->

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

extends 태그: 템플릿 엔진에게 이 템플릿은 다른템플릿(부모)을 확장한다고 알림.

그때, 템플릿 엔진은 base.html에 있는 세 개의 block 태그를 알아차리고 자식 템플릿의 내용으로 치환. 


이러한 접근방법을 통해 코드 재사용을 극대화 시키고, 섹션 내의 네비게이션과 같이 공유된 컨텐츠부분에 항목을 쉽게 추가할 수 있다.


 상속 활용 Tips.

  • {% extends %} :템플릿의 첫 태그로 두어야 상속작동.
  • 기본 템플릿에서 {% block %} 태그를 최대한 활용할 것. 
  •  중복 코드 발생시 부모 템플릿의 {% block %} 으로 이동하여 사용할것.
  • 부모 블록의 내용을 완전히 덮어쓰지 않고 일부만 추가하고자 할때는 {{ block.super }}를 사용.
  • {% endblock %}에 태그 이름 붙이기. > {% endblock content%}: 가독성 용이.

Accessing method calls. 메소드 호출 엑세스.

객체에 첨부 된 대부분의 메소드 호출은 템플릿 내에서 사용할 수 있다.
즉, 템플릿은 필드이름과 같은 클래스 속성 및 뷰에서 전달 된 변수 이외의 요소에도 엑세스 할 수 있다.
예를 들어, Django ORM은 외래키와 관련된 객체의 컬렉션을 찾는 "entry_set" 구문을 제공한다. 

-for instance:
task 모델과 외래 키 관계를 갖는 comment 모델이 주어지면, task 모델과 관계된 모델의 속성을 불러올 수 있다. 

{% for comment in task.comment_set.all %} <!--task모델과 관계된 comment모델의 모든 속성--> {{ comment.message }} <!--task모델과 관계된 comment모델의 massage 속성 출력--> {% endfor %}


반응형