저번 포스트에서 포스팅 했듯이 시스템에는 기본 제공 태그와 필터가 함께제공됩니다.

이번 포스트에서는 가장 일반적인 태그와 필터를 정리해보겠습니다.


[태그]


* if / else


{% if %} 태그는 변수를 평가합니다. 


{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% endif %}

An `{% else %}` tag is optional:

{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% else %}
<p>Get back to work.</p>
{% endif %}

elif 절도 사용 가능하죠.


{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
<p>Athletes should be out of the locker room soon! </p>
{% elif ...
...
{% else %}
<p>No athletes. </p>
{% endif %}

{% if %} 태그는 and, or 또는 not을 사용하여 여러 변수를 테스트하거나 주어진 변수를 무효화 합니다.


{% if athlete_list and coach_list %}
<p>Both athletes and coaches are available. </p>
{% endif %}

{% if not athlete_list %}
<p>There are no athletes. </p>
{% endif %}

{% if athlete_list or coach_list %}
<p>There are some athletes or some coaches. </p>
{% endif %}

{% if not athlete_list or coach_list %}
<p>There are no athletes or there are some coaches. </p>
{% endif %}

{% if athlete_list and not coach_list %}
<p>There are some athletes and absolutely no coaches. </p>
{% endif %}

동일한 태그 내에서 and와 or절을 모두 사용할 수 있으며 and 가 or 보다 우선순위가 높습니다.


{% if athlete_list and coach_list or cheerleader_list %}

결과는 아래와 같죠


if (athlete_list and coach_list) or cheerleader_list

하지만 if 문에서 ()의 사용은 잘못된 방법입니다. 즉 다른 연산자를 결합하지 마세요.


만약 우선 순위를 나타 내기 위해서 괄호가 필요한 경우는 중첩된 if 태그를 사용해야 합니다.


조작 순서 제어에 괄호를 사용하는 것은 지원되지 않습니다.


괄호가 필요하다고 생각되면 템플릿 외부에서 먼저 로직을 수행하고 그 결과를 전용 템플릿 변수로 전달하는 방법을 먼저 고려하세요..


또는 아래와 같이 중첩된 태그를 사용하세요.


 {% if athlete_list %}
     {% if coach_list or cheerleader_list %}
         <p>We have athletes, and either coaches or cheerleaders! </p>
     {% endif %}
 {% endif %}

동일한 논리연산자를 여러번 사용하는 것은 좋지만, 다른 연산자를 결합 할 수는 없습니다. 예를 들면 아래와 같습니다.


{% if athlete_list or coach_list or parent_list or teacher_list %}

각 {% if %}와 {% endif %}를 닫아야 합니다. 그렇지 않으면 Django는 TemplateSyntaxError를 던집니다.


* for


{% for %} 태그를 사용하면 시퀀스의 각 항목을 반복할 수 있습니다.


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

반대방향으로 루핑하려면 태그에 반전을 추가하세요


{% for athlete in athlete_list reversed %}
...
{% endfor %}

for태그를 중첩할 수도 있습니다.


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

리스트 안의 리스트를 반복해야 하는 경우 각 하위 목록의 값을 개별 변수로 따낼수 있습니다.


예를 들면 컨텍스트에 point라고 불리는 (x,y) 좌표 목록이 있으면 다음을 사용하여 점 목록을 출력 할 수 있습니다.


{% for x, y in points %}
<p>There is a point at {{ x }},{{ y }}</p>
{% endfor %}

딕셔너리의 항목에 엑세스하는 경우에도 유용하게 사용할 수 있습니다.


{% for key, value in data.items %}
{{ key }}: {{ value }}
{% endfor %}

매우 일반적인 패턴은 반복하기 전에 list의 크기를 확인하고 목록이 비어있는 경우에는 특수 텍스트를 출력하는 방법입니다.


{% if athlete_list %}

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

{% else %}
<p>There are no athletes. Only computer programmers.</p>
{% endif %}

이 패턴은 매우 일반적이므로 for 태그는 목록이 비어있는 경우 출력할 내용을 정의할수 있는 {% empty %} 절을 지원합니다!.


{% for athlete in athlete_list %}
<p>{{ athlete.name }}</p>
{% empty %}
<p>There are no athletes. Only computer programmers.</p>
{% endfor %}

알아 두어야 할 것은 break 와 continue를 지원하지 않는 다는것을 유념하십시오.

각 {% for %} 루프 내에서 forloop이라는 템플릿 변수에 엑세스 할 수 있습니다.


이 변수는 루프의 진행상황에 대한 정보를 제공하는 몇가지 속성이 있습니다.


forloop.counter는 루프가 돈 count 입니다. 1부터 시작합니다.


 {% for item in todo_list %}

  <p>{{ forloop.counter }}: {{ item }}</p>
  {%  endfor %}

forloop.counter0 는 1이아니고 0부터 시작하는것만 빼고는 위와같습니다.

forloop.revcounter는 항상 루프의 나머지 항목수를 나타냅니다. 마지막루프를 돌때 1입니다.

forloop.revcounter0는 마지막 0입니다. 위와같습니다.

forloop.first는 루프를 처음 실행 할 경우 True입니다. (특수 한경우 처리에 편합니다.)



  {% for object in objects %}

  {% if forloop.first %}<li class="first">{% else %}<li>
      {% endif %}
      {{ object }}
  </li>
  {% endfor %}

forloop.last 동일한데 마지막입니다.


{% for link in links %}
  {{ link }}{% if not forloop.last %} | {% endif %}
{% endfor %}

위의 결과는 아래처럼 나올 수 있습니다.


  Link1 | Link2 | Link3 | Link4

단어사이에 쉼표도 넣을수 있죠


  <p>Favorite places:</p>
      {% for p in places %}{{ p }}{% if not forloop.last %}, {% endif %}
      {% endfor %}

forloop.parentloop 부모 실행에 대한 forloop 객체에 대한 참조입니다.


 {% for country in countries %}
  <table>
      {% for city in country.city_list %}
      <tr>
          <td>Country #{{ forloop.parentloop.counter }}</td>
          <td>City #{{ forloop.counter }}</td>
          <td>{{ city }}</td>
      </tr>
      {% endfor %}
  </table>
  {% endfor %}

forloop 변수는 루프 내에서만 사용할 수 있습니다.

템플릿 파서가 {% endfor %}에 도달하면 forloop를 소멸시켜버립니다.


* ifequal/ifnotequal


<<우선 여기까지만 적기로 했습니다.>>

'Python > Django' 카테고리의 다른 글

[Django] RestFrameWork 튜토리얼 - 2. Request와 Response  (0) 2017.03.10
[Django] RestFrameWork 튜토리얼 - 1. 직렬화  (0) 2017.03.10
[Django] 템플릿  (0) 2017.03.08
[Django] Dynamic URL  (0) 2017.03.08
[Django] VIew와 URL conf  (0) 2017.03.07
Posted by C마노
,