ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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)

    댓글

Designed by Tistory.