본문 바로가기
장고 프레임워크

Django Template 문법에 관하여

by 문자메일 2020. 6. 3.

{% extends "###.html" %}

- HTML 코드 상속의 개념

- 장고 프로젝트내에 존재하는 .html 파일의 코드를 위 명령어로 상속받은 것처럼 사용할 수 있다.

- {% extends ... %} 사용하는 부모 파일과 상속받아 사용하는 자식 파일 모두 {% block .. %} 템플릿 테그 작성하여 바로 아래 설명처럼 사용하여야 한다.

 

{% block ###### %}

{% endblock %}

- ###### 부분에 이름 아무거나 넣으면 된다.

- 부모가 지정한 html 파일에서 block 범위에 자식 html파일에서 html 코드를 넣을때 사용 .

case 1) 부모는 자식이 html 코드를 넣을 수 있는 부분에

{% block ##### %}

{% endblock %}

으로 표시를 한다.

 

case 2) 자식 html 파일에서는 먼저 부모의 html 파일을 파일 첫줄에서 '{% extends 'instagram/layout.html' %}' 처럼 부모의 block 부분에 html 코드를 밀어넣을 부모를 상속을 받는다. 이후,

{% block ###### %}

HTML HTML HTML

HTML HTML .....

{% endblock %}

처럼 넣고 싶은 코드를 집어넣으면 부모의 block 부분에 자식에서 작성한 코드가 들어가 있는 것을 확인할 수 있다.

 

{% for object in object_list%}

{% endfor %}

 

- 아래처럼 views.py 에서 'key':'value'로 Data를 Template로 전달해 줄 수 있고, Template에서 받아서 사용할 수 있다.

return render(request, "instagram/index.html",{

        "suggested_user_list":suggested_user_list,

    })

 

- views.py에서 전달받은 Data로 반복문을 사용하는 부분이다.

{% for suggested_user in suggested_user_list %}

            {% include "instagram/timeline_sidebar_user_follow.html"%}

{% endfor %}

 

{% empty %} 

- 위의 {% for %} 와 연계하여 사용할 수도 있음.

- 정확한 기능 동작은 모르겠지만, list의 값이 빈 경우 {% empty %} 의 값 출력하는 것으로 추정 된다.

{% for suggested_user in suggested_user_list %}

            {% include "instagram/timeline_sidebar_user_follow.html"%}

{% empty %}

            추천 친구가 없습니다.

{% endfor %}

{% include #######.html %}

- html 파일의 특정 부분에 다른 html 파일의 코드를 집어넣을 수 있는 기능

- 위에서 block 기능은 block을 가진 부모 html을 여러 자식이 상속을 받아서 각각 원하는 대로 Custom을 하기 편하게 하는대 탁월하다. 반면에 include 기능은 하나의 html 파일을 컴포넌트처럼 만들어서 필요한 부분에 쉽게 넣을 수 있는 편의기능을 제공하여 준다.  

 

<div class="card-body text-muted">

        {% for suggested_user in suggested_user_list %}

            {% include "instagram/timeline_sidebar_user_follow.html"%}

        {% endfor %}

</div>

위 코드 처럼 사용 시 "instagram/timeline_sidebar_user_follow.html" 에 존재하는 html 코드 들이 <div></div> 태그 안에 적용된다.

 

 

{% url #URL_NAME# %}

프로젝트 내의  urls.py에서 아래와 같은 url name을 가진 URL이 존재할 때,

re_path(r'^(?P<username>[\w.@+-]+)/follow/$', views.user_follow, name='user_follow'),

 

HTML 안에서 {% url %} Template 문법으로 아래처럼 URL_REVERSE를 사용할 수 있다.

<a href="{% url "user_follow" suggested_user.username %}">Follow</a>

"user_follow" 부분에 url_name 입력

suggested_user.username 부분에 위 케이스는 정규표현식을 받는 부분이라 값 전달한다.

 

 

 

{{ user.following_set.all }}

기본적으로 user 정보는 views.py에서 전달하지 않아도 Template상에 기본으로 현재 로그인된 user의 정보가 넘어오게 구현되어있는것으로 추정된다. (아닐수도 있음..)

 

 

{% load static %}

 

{% if messages %}

    {% for message in messages %}

        <div class="alert alert-{{message.tags}}">

            {{message}}

        </div>

    {% endfor %}

{% endif %}

 

 

 

Django Custom Filter 사용법

templatetags폴더와 아래 2개 .py 파일 생성

 

|(파이프) 앞의 첫번째 인자가 value로 넘어가고, 다음 값이 arg로 넘어가게 된다.

 

위처럼 사용할 html파일에서 {% load 파일 %} 해야 한다.

 

 

class Post(BaseModel):

    def is_like_user(selfuser):

        return self.like_user_set.filter(pk=user.pk).exists()

 

{{ post.is_like_user(user) }}

Django Template Tag에서는 객체에 대한 함수를 호출할 수는 있지만, 인자를 넘길 수 있는 문법은 지원하지 않는다.

 

{{ post.is_like_user }}

인자 없는 함수는 위처럼 호출할 수 있다.

 

 

######

Django Template 내에서 {{ user }} 으로 현재 user 정보 받을 수 있는 이유

- 로그인 : User 모델 인스턴스

- 로그아웃 : AnnoymousUser (파이썬 클래스) 인스턴스

settings.py에서 Template 안에서 사용할 Context 사전의 목록들을 만들어주는 함수들이 선언되어 있는대, 그 중  auth를 통해서 {{ user }} 객체를 받을 수 있다. 아래에 'perms'의 값 찍어본 내용도 존재한다.

{{ user.is_authenticated }} 으로 Login 되어있는지 확인도 가능

doc : https://github.com/django/django/blob/master/django/contrib/auth/context_processors.py

https://github.com/django/django/blob/master/django/contrib/auth/base_user.py

 

######

'장고 프레임워크' 카테고리의 다른 글

4) APIView를 활용한 뷰 만들기  (0) 2020.06.07
views.py에 관하여  (0) 2020.06.04
Django Model 관계에 관하여.  (0) 2020.06.03
3 - JSON 직렬화  (0) 2020.05.31
1. API Server와 Rest  (0) 2020.05.29

댓글