Akashic Records

[추가자료] 8.3 웹 프레임워크 - Django Templates 본문

Python for Beginners

[추가자료] 8.3 웹 프레임워크 - Django Templates

Andrew's Akashic Records 2024. 6. 19. 13:47
728x90

Django

 

Django의 템플릿 시스템은 동적 웹 페이지를 생성하기 위한 강력하고 유연한 방법을 제공합니다. 이 시스템은 웹 애플리케이션의 프론트엔드를 구성하는 HTML을 동적으로 처리할 수 있도록 설계되었습니다. Django 템플릿은 Python 코드에서 HTML 코드로 데이터를 전달하는 규칙에 따라 구성됩니다. 이를 통해 개발자는 웹 페이지의 로직과 디자인을 분리할 수 있어, 유지보수가 용이하고 코드의 가독성도 높아집니다.

템플릿의 핵심 기능

  1. 변수 치환: 템플릿에는 중괄호 {{ }}를 사용하여 변수를 포함시킬 수 있습니다. 이 변수들은 뷰에서 템플릿으로 전달된 컨텍스트 데이터를 참조하여 그 값을 템플릿에 동적으로 채워 넣습니다.
  2. 태그 시스템: Django 템플릿은 {% %}를 사용하여 조건문, 반복문, 필터 등을 처리하는 태그 시스템을 제공합니다. 이 태그들은 템플릿에 로직을 추가하여 더 동적인 컨텐츠 생성을 가능하게 합니다.
  3. 필터: 필터는 변수의 출력을 수정할 때 사용합니다. 파이프 심볼 |을 사용하여 구현하며, 문자열을 조작하거나 데이터 형식을 변경할 때 유용합니다.
  4. 템플릿 상속: 템플릿 상속을 사용하면 기본 템플릿 파일에서 일반적인 구조를 정의하고, 다른 템플릿에서 이를 상속받아 특정 부분만을 재정의할 수 있습니다. 이는 코드 중복을 크게 줄여 줍니다.
  5. 커스텀 태그와 필터: 개발자는 필요에 따라 자신만의 태그나 필터를 정의하여 템플릿 시스템을 확장할 수 있습니다. 이를 통해 템플릿의 기능을 맞춤 설정할 수 있습니다.

활용 사례

Django 템플릿은 웹사이트의 어떤 페이지에서도 사용될 수 있으며, 사용자 인터페이스의 일관성을 유지하는 데 큰 역할을 합니다. 데이터 표시, 사용자 입력 양식, 관리자 대시보드, 사용자 대시보드 등 거의 모든 웹 페이지 구성 요소에서 활용됩니다.

 

템플릿 시스템은 WEB  MVC 아키텍처에서 "View"(Django의 view가 아닙니다.) 부분을 담당하며, 뷰와 모델에서 처리한 데이터를 사용자가 이해하기 쉬운 형태로 변환하는 중요한 역할을 수행합니다. 이러한 기능성과 유연성 덕분에 Django 템플릿은 개발자들 사이에서 매우 인기가 높습니다.

Template 기본설정

Django 템플릿 시스템을 효과적으로 사용하기 위한 개발자 가이드를 제공하겠습니다. 이 가이드는 Django 템플릿의 기본적인 사용법에서부터 보다 고급 기능의 사용 방법까지 다룹니다. 목적은 데이터를 HTML로 변환하여 사용자에게 보여주는 효과적인 방법을 설명하는 것입니다.

기본 설정과 구성

  1. 템플릿 설정 확인:
    • settings.py 파일에서 TEMPLATES 설정을 확인하십시오. 이 설정은 템플릿 엔진과 파일 경로, 그리고 사용할 컨텍스트 프로세서를 정의합니다.
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],  # 전역 템플릿 디렉토리
            'APP_DIRS': True,  # 각 앱의 템플릿 디렉토리를 자동으로 찾게 함
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
  2. 템플릿 디렉토리 구조:
    • 일반적으로 각 Django 앱 폴더 내에 templates 폴더를 만들고, 그 안에 앱 이름과 동일한 폴더를 생성한 후, 그 안에 템플릿 파일을 위치시킵니다. 이 구조는 템플릿 이름 충돌을 방지합니다.

템플릿 문법

  1. 변수 출력:
    • {{ variable_name }}을 사용하여 템플릿에 변수를 출력할 수 있습니다. 필요에 따라 필터를 사용하여 변수의 출력 형식을 변경할 수 있습니다.
  2. 태그 사용:
    • 로직을 처리하기 위해 {% tag %} 형식의 태그를 사용합니다. 가장 일반적인 태그에는 {% if %}, {% for %}, {% block %} 등이 있습니다.
  3. 필터 사용:
    • 변수를 수정하여 출력하려면 {{ variable|filter }} 형식을 사용합니다. 예를 들어, {{ name|lower }}는 이름을 소문자로 출력합니다.
  4. 템플릿 상속:
    • 코드 중복을 피하기 위해 {% extends "base.html" %}를 사용하여 기본 템플릿을 상속받을 수 있습니다. {% block %}을 사용하여 특정 섹션을 오버라이드 할 수 있습니다.

고급 템플릿 기능

  1. 커스텀 템플릿 태그와 필터:
    • Django는 커스텀 태그와 필터를 만들어 등록할 수 있는 시스템을 제공합니다. 이를 통해 템플릿의 기능을 확장할 수 있습니다.
  2. 템플릿에서의 보안 고려사항:
    • 크로스 사이트 스크립팅(XSS) 공격을 방지하기 위해, 사용자 입력을 템플릿에 출력할 때는 항상 이스케이핑 처리가 필요합니다. Django 템플릿은 기본적으로 HTML 이스케이핑을 수행합니다.

디버깅과 최적화

  1. 템플릿 디버깅:
    • django.template.context_processors.debug 컨텍스트 프로세서를 활성화하면 개발 중에 템플릿 디버깅 정보를 보다 쉽게 얻을 수 있습니다.
  1. 성능 최적화:
    • include 태그의 사용을 최소화하고, 데이터베이스 쿼리를 최적화하여 템플릿 렌더링 시간을 단축합니다. 캐싱 전략을 사용하여 반복적으로 처리하는 복잡한 데이터의 템플릿 렌더링 결과를 캐시할 수 있습니다.

Template 조건문과 반복문

Django 템플릿에서 사용하는 조건문과 반복문은 템플릿 내에서 데이터를 동적으로 표현하는 데 필수적인 요소입니다. 이 문법들은 Python의 문법과 유사하지만, 템플릿 내에서 사용하기 위해 간소화되어 있습니다.

조건문

조건문은 {% if %} 태그를 사용하여 구현됩니다. Django 템플릿은 if, elif, else 구문을 지원합니다.

 

기본 사용법:

{% if user.is_authenticated %}
    <p>Welcome back, {{ user.username }}!</p>
{% else %}
    <p>Please log in to continue.</p>
{% endif %}

 

다중 조건:
elifelse를 사용하여 다양한 조건을 처리할 수 있습니다:

{% if temperature > 30 %}
    <p>It's really hot today!</p>
{% elif temperature > 20 %}
    <p>What a nice weather!</p>
{% else %}
    <p>It might be cold, dress warmly.</p>
{% endif %}

 

조건 연산자:
and, or, not 연산자를 사용할 수 있습니다:

{% if not user.is_anonymous and user.is_active %}
    <p>Welcome, active user!</p>
{% endif %}

반복문

반복문은 {% for %} 태그를 사용하여 구현됩니다. 이를 사용하여 리스트나 딕셔너리 같은 반복 가능한 데이터 구조를 순회할 수 있습니다.

 

기본 사용법:

<ul>
{% for item in item_list %}
    <li>{{ item.name }}</li>
{% endfor %}
</ul>

 

빈 리스트 처리:
반복할 데이터가 없는 경우 {% empty %} 클로즈를 사용하여 대체 콘텐츠를 제공할 수 있습니다:

<ul>
{% for item in item_list %}
    <li>{{ item.name }}</li>
{% empty %}
    <li>No items found.</li>
{% endfor %}
</ul>

 

반복 변수:
for 반복문 내에서 사용할 수 있는 여러 유용한 변수들이 있습니다:

  • forloop.counter: 1부터 시작하는 현재 반복 횟수
  • forloop.counter0: 0부터 시작하는 현재 반복 횟수
  • forloop.revcounter: 루프의 끝에서 1까지 거꾸로 세는 숫자
  • forloop.revcounter0: 루프의 끝에서 0까지 거꾸로 세는 숫자
  • forloop.first: 루프의 첫 번째 항목일 때 True
  • forloop.last: 루프의 마지막 항목일 때 True
  • forloop.parentloop: 중첩된 for 루프에서 상위 루프를 참조할 때 사용

중첩 반복:
리스트 안의 리스트를 순회하는 중첩된 반복문을 사용할 수 있습니다:

<ul>
{% for sublist in nested_list %}
    {% for item in sublist %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>

Django 템플릿의 조건문과 반복문은 템플릿 내에서 복잡한 로직을 처리할 수 있도록 설계되어 있으며, HTML 생성을 동적으로 제어하는 데 필수적입니다. 이러한 문법을 이해하고 사용함으로써 템플릿의 표현력과 유연성을 크게 향상시킬 수 있습니다.

Django View와 연계

Django에서 뷰(View)와 템플릿(Template)을 연계할 때는 주로 뷰 함수나 클래스 기반 뷰에서 템플릿을 렌더링하기 위해 render() 함수를 사용합니다. 이 과정에서 뷰는 컨텍스트 데이터를 템플릿에 전달하고, 템플릿은 이 데이터를 사용자에게 보여줄 최종 HTML을 생성합니다.

render() 함수

render() 함수는 요청 객체, 템플릿 이름, 그리고 템플릿에 전달될 데이터(딕셔너리 형태의 컨텍스트)를 인자로 받습니다. 이 함수는 지정된 데이터를 템플릿에 적용하고, 렌더링된 페이지의 HttpResponse 객체를 반환합니다.

기본 사용법:

from django.shortcuts import render

def my_view(request):
    # 컨텍스트: 템플릿에 전달할 데이터
    context = {'key': 'value'}
    # render() 함수를 사용하여 템플릿 렌더링
    return render(request, 'my_template.html', context)

컨텍스트 전달

뷰에서 템플릿으로 데이터를 전달할 때는 컨텍스트 변수를 사용합니다. 컨텍스트는 Python 딕셔너리 형태로, 템플릿에서 사용할 각종 변수들을 담고 있습니다.

예시:

def book_detail(request, book_id):
    book = get_object_or_404(Book, pk=book_id)
    return render(request, 'book_detail.html', {'book': book})

템플릿에서 컨텍스트 사용

템플릿 내에서는 뷰로부터 받은 컨텍스트 변수들을 사용하여 동적인 데이터를 표시할 수 있습니다.

템플릿 예시 (book_detail.html):

<h1>{{ book.title }}</h1>
<p>Author: {{ book.author.name }}</p>
<p>Description: {{ book.description }}</p>

클래스 기반 뷰와 템플릿 연계

클래스 기반 뷰(Class-Based View, CBV)를 사용할 때는 TemplateView나 다른 제네릭 뷰를 상속하여 템플릿 렌더링을 처리할 수 있습니다.

예시:

from django.views.generic import TemplateView

class HomePageView(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['latest_articles'] = Article.objects.all()[:5]
        return context

이 예시에서 HomePageView 클래스는 TemplateView를 상속받아 template_name을 통해 사용할 템플릿을 지정하고, get_context_data() 메소드를 오버라이드하여 추가적인 컨텍스트 데이터를 템플릿에 전달합니다.

 

728x90
Comments