-
django 입문 (7) 템플릿 파일Backend/Django 2023. 8. 2. 23:54
자주 사용되는 페이지 형식(html)을 템플릿으로 만들어 여러 앱에서 재사용할 수 있음. = 장고의 템플릿
render()
파이썬 데이터를 템플릿에 적용하여 HTML로 반환하는 함수
render(request, {templat파일경로}, 데이터)
from .django.shorcuts import render from .models import Question def index(request): question_list = Question.objects.order_by("-create_date") context = {"question_list": question_list} return render(request, "pybo/question_list.html", context)
- {Model}.objects.order_by()속성명 앞에 ‘-’ 를 붙이면 역방향 정렬이 된다.
- 조회 결과를 Model 객체의 속성을 기준으로 정렬하는 함수. parameter로 Model 객체의 멤버 속성명을 string으로 갖는다. ex) “create_date” 은 Question 의 멤버 변수.
- context: 템플릿 파일(=.html 파일, 위 Code에서는 question_list.html에 해당)에 넘겨주는 파이썬 데이터. 템플릿 파일에서는 넘겨 받은 파이썬 데이터에 접근할 때, context의 Key 로 접근한다. HTML 에서의 사용 예) {% for question in question_list %}
템플릿 위치 설정
TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplate", "DIRS": [BASE_DIR / "templates"], # 템플릿 파일의 경로(디렉터리) 설정 (생략...) } ]
템플릿 디렉터리의 경우 각 앱 디렉터리 하위가 아니라 프로젝트 디렉터리의 하위로 설정하는 것을 권장. 이유는 앱 별로 공통으로 사용되는 템플릿을 관리하기 위함.
ex) {project}/templates/
각 앱 별 템플릿은 {project}/templates/{app1} 과 같은 형태로 관리하면 된다.
템플릿 파일
파이썬 데이터를 읽어서 사용할 수 있는 HTML 파일
{% ~ %} : 템플릿 태그를 표현하는 기호. 기호 사이에는 분기(if), 반복(for), 템플릿 필터 등이 들어갈 수 있다. if나 for문이 종료되는 곳에 {% endif %} 나 {% endfor %} 를 작성해야 한다.
사용 가능한 Tag
- include: 다른 템플릿 파일을 삽입할 때 사용
- csrf_token
- forloop.count/count0/first/last: for 문 안에서 루프 내 순서-1~전체/0~전체/첫번째/마지막
{{ ~ }} : 안에 들어간 데이터를 출력하는 템플릿 태그 기호
ex) {{ item }}
{% if 조건문1 %} <p>조건문1에 해당되는 경우</p> {% elif 조건문2 %} <p>조건문2에 해당되는 경우</p> {% else %} <p>조건문1, 2에 모두 해당되지 않는 경우</p> {% endif %} {% for item in list %} <p>순서: {{ forloop.counter }} </p> <p>{{ item }}</p> {% endfor %}
<div> <label>답변내용</label> <textarea {% if not user.is_authenticated %}disabled{% endif %} ~></textarea> </div>
템플릿 파일에서 URL 별칭을 이용하여 URL을 동적으로 사용하는 방법
실무에선 URL 리팩토링이 빈번하게 발생하므로 템플릿 파일에서 URL을 하드코딩하는 방법은 효율적이지 못함. 대신 URL에 대한 링크 주소에 1:1 매핑된 별칭을 사용한다.
이 때 URL 별칭에는 app_name 이란 변수를 이용하여 네임스페이스를 지정할 수 있다. 네임스페이스가 지정된 별칭은 템플릿 파일에서 사용될 경우 반드시 ‘네임스페이스:별칭’ 의 형식으로 사용되어야 한다.
from django.urls import path from . import views app_name = "pybo" # url 별칭의 namespace를 pybo 앱으로 한정 urlpatterns = [ path('', views.index, name="index"), path("<int:question_id>/", views.detail, name="detail"), ]
http://localhost:8000/pybo 는 index란 별칭에, http://localhost:8000/pybo/1/ 은 detail이란 별칭에 1:1 매핑된다.
{% if question_list %} <ul> {% for question in question_list %} <!-- 이전 code: <li><a href="pybo/{{question.id}}">{{question.subject}}</a></li>--> <li><a href="{% url 'pybo:detail' question.id %}/">{{question.subject}}</a></li> {% endfor %} {/ul} {% else %} <p>질문이 없습니다.</p> {% endif %}
{% url ‘pybo:detail’ question.id %}
urls.py 에서 http:~/{int}/ url은 주소 마지막에 오는 정수를 question_id에 저장하여 parameter로 전달하도록 선언했다.(int:question_id) 따라서 별칭(‘pybo:detail’) 다음에 띄어쓰기로 구분되어 작성된 값들은 urls.py에서 parameter로 전달하기로 한 값들이라고 이해하면 될 듯.
urls.py에서 선언한 parameter가 2개 이상이면 공백 문자 이후에 덧붙여주면 된다. 다음과 같이 파라미터명을 함께 사용할 수도 있다.
{% url ‘pybo:datail’ question_id=question.id page=2 %}
상속 extends
템플릿 파일 간 공통된 HTML 구조는 ‘상속’으로 재사용이 가능하다.
{% load static %} <!doctype html> (생략) <body> {% block content %} # 원하는 위치에 기입할 것. 해당 파일을 상속 받는 템플릿 파일의 Code들이 위치하게 된다. {% endblock %} </body> </html>
{% extends 'base.html' %} # 'base.html' 대신에 상속 받을 html 파일명을 작성하면 된다. {% block content %} (생략) {% endblock %}
템플릿 필터
템플릿 태그에서 ‘|’ 문자 뒤에 사용하는 필터
자주 사용하는 목록
- |default_if_none:’’ : 폼 필터라고 부름. content에 값이 없으면 원래는 None이 출력 되지만 None대신 공백을 출력하라는 의미
- |add:N (N은 정수) : 필터 앞의 값에 N 을 더함.
템플릿 필터 추가
직접 템플릿 필터를 만들어 사용할 수도 있다. 방법은 다음과 같다.
- 추가한 템플릿 필터는 {app}/templatetags 라는 이름의 디렉터리 안에 존재해야 하므로 App 경로에 tempaltetags 라는 이름의 디렉터리를 추가한다.
from django import template register = template.Library() @register.filter def filter_name(value, arg): # value는 필터 앞에 오는 값, arg는 필터 다음에 오는 값 return True
- 템플릿 파일에 {% load [템플릿필터파일명] %} 을 추가한다. 위치는 상속문({% extends ~ %} 다음.
참고 자료
점프투장고: 점프 투 장고(WikiDocs)
'Backend > Django' 카테고리의 다른 글
django 입문(5) Model 3) DB에 Table 생성 (0) 2023.09.17 django 입문(5) Model 2) 추가 기능 (0) 2023.09.17 django 입문(6) 장고관리자 admin (0) 2023.07.12 django 입문(5) Model 1) 기본 사용법 (0) 2023.07.10 django 입문(4) CRUD 기본 작업 (0) 2023.07.07