장고 템플릿
이전 장에서는 django.http.HttpResponse()를 사용하여 "Hello World!"를 출력했습니다. 이 방법은 Django의 MVC 아이디어를 따르지 않는 데이터와 뷰를 혼합합니다.
이 장에서는 Django 템플릿의 활용 방법을 자세히 소개합니다. 템플릿은 문서의 프레젠테이션 형식과 내용을 구분하는 데 사용되는 텍스트입니다.
템플릿 적용 예시
이전 장의 프로젝트를 이어가며 HelloWorld 디렉토리 아래에 template 디렉토리를 생성하고 hello.html 파일을 생성합니다. 전체 디렉토리 구조는 다음과 같습니다.
HelloWorld/ |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- settings.py | |-- settings.pyc | |-- urls.py | |-- urls.pyc | |-- view.py | |-- view.pyc | |-- wsgi.py | `-- wsgi.pyc |-- manage.py `-- templates `-- hello.html
hello.html 파일은 다음과 같습니다. 코드는 다음과 같습니다:
<h1>{{ hello }}</h1>
From 템플릿에서 우리는 변수가 이중 괄호를 사용한다는 것을 알고 있습니다.
다음으로 템플릿 파일의 경로를 Django에 설명하고, HelloWorld/settings.py를 수정하고, TEMPLATES의 DIRS를 아래와 같이 [BASE_DIR+"/templates",]로 수정해야 합니다.
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR+"/templates",], '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', ], }, }, ]
이제 view.py를 수정하고 템플릿에 데이터를 제출하기 위한 새 개체를 추가합니다.
# -*- coding: utf-8 -*- #from django.http import HttpResponse from django.shortcuts import render def hello(request): context = {} context['hello'] = 'Hello World!' return render(request, 'hello.html', context)
보다시피 여기서는 이전에 사용된 HttpResponse를 대체하기 위해 render를 사용합니다. render는 또한 사전 컨텍스트를 매개변수로 사용합니다.
컨텍스트 사전에 있는 요소의 키 값 "hello"는 템플릿의 변수 "{{ hello }}"에 해당합니다.
http://192.168.45.3:8000/hello/를 다시 방문하면 다음 페이지를 볼 수 있습니다.
이렇게 하여 데이터 출력을 위한 템플릿 사용을 완료하여 데이터와 뷰의 분리를 달성했습니다.
다음에는 템플릿에서 흔히 사용되는 문법 규칙을 자세히 소개하겠습니다.
Django 템플릿 태그
if/else 태그
기본 구문 형식은
{% if condition %} ... display {% endif %}
or:
{% if condition1 %} ... display 1 {% elif condiiton2 %} ... display 2 {% else %} ... display 3 {% endif %}
조건에 따라 출력 여부를 결정합니다. if/else는 중첩을 지원합니다.
{% if %} 태그는 여러 변수를 판단하거나 변수를 부정(not)하기 위해 and, or or not 키워드를 허용합니다. 예:
{% if athlete_list and coach_list %} athletes 和 coaches 变量都是可用的。 {% endif %}
for 태그
{% for %}를 사용하면 순서.
Python의 for 문과 유사하게 루프 구문은 for X in Y입니다. 여기서 Y는 반복할 시퀀스이고 X는 각 특정 루프에 사용되는 변수 이름입니다.
각 루프에서 템플릿 시스템은 {% for %}와 {% endfor %} 사이의 모든 것을 렌더링합니다.
예를 들어, Athletic_list 변수에 운동선수 목록이 있으면 다음 코드를 사용하여 목록을 표시할 수 있습니다.<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
목록이 역순으로 반복되도록 레이블에 reversed를 추가하세요.
{% 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 %}
ifequal/ifnotequal 태그
{% ifequal %} 태그는 두 값을 비교하여 동일할 경우 {% ifequal %}와 {% endifequal % 사이의 모든 값을 표시합니다. }.
다음 예에서는 두 개의 템플릿 변수 user와 currentuser를 비교합니다.
{% ifequal user currentuser %} <h1>Welcome!</h1> {% endifequal %}
{% if %}와 유사하게, {% ifequal %}는 선택적 {% else%} 태그를 지원합니다. 8
{% ifequal section 'sitenews' %} <h1>Site News</h1> {% else %} <h1>No News Here</h1> {% endifequal %}
Comment 태그
Django 사용 { # #} 댓글입니다.
{# 这是一个注释 #}
Filters
템플릿 필터는 변수가 표시되기 전에 수정할 수 있습니다. 필터는 아래와 같이 파이프 문자를 사용합니다.
{{ name|lower }}
{{ name }} 변수가 Lower 필터에 의해 처리된 후 문서 대문자 변환 텍스트는 소문자로 변경됩니다.
필터 파이프는 *소켓*될 수 있습니다. 즉, 한 필터 파이프의 출력을 다음 파이프의 입력으로 사용할 수 있습니다.
{{ my_list|first|upper }}
위 예에서는 첫 번째 요소를 가져와 대문자로 변환합니다.
일부 필터에는 매개변수가 있습니다. 필터 인수는 콜론 뒤에 오고 항상 큰따옴표로 묶입니다. 예:
{{ bio|truncatewords:"30" }}
이것은 변수 bio의 처음 30개 단어를 표시합니다.
기타 필터:
addslashes : 백슬래시, 작은따옴표 또는 큰따옴표 앞에 백슬래시를 추가합니다.
date: 지정된 형식 문자열 매개변수에 따라 날짜 또는 날짜/시간 개체의 형식을 지정합니다. 예:
{{ pub_date|date:"F j, Y" }}
length: 변수의 길이를 반환합니다.
include 태그
{% include %} 태그를 사용하면 다른 템플릿의 콘텐츠를 템플릿에 포함할 수 있습니다.
다음 두 예제 모두 nav.html 템플릿을 포함합니다.
{% include "nav.html" %}
템플릿 상속
템플릿은 상속을 통해 재사용할 수 있습니다.
다음으로 먼저 이전 프로젝트의 템플릿 디렉터리에 base.html 파일을 생성합니다. 코드는 다음과 같습니다.
<html> <head> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> {% block mainbody %} <p>original</p> {% endblock %} </body> </html>
위 코드에서 mainbody라는 블록 태그는 후속 작업으로 대체될 수 있는 부분입니다.
모든 {% block %} 태그는 하위 템플릿이 이러한 부분을 재정의할 수 있음을 템플릿 엔진에 알립니다.
hello.html은 base.html을 상속하고 특정 블록을 대체합니다. hello.html의 수정된 코드는 다음과 같습니다.
{% extends "base.html" %} {% block mainbody %} <p>继承了 base.html 文件</p> {% endblock %}
코드의 첫 번째 줄은 hello.html이 base.html 파일을 상속함을 나타냅니다. 보시다시피, 여기서 같은 이름을 가진 블록 태그는 base.html의 해당 블록을 대체하는 데 사용됩니다.
주소 http://192.168.45.3:8000/hello/를 다시 방문하면 출력 결과는 다음과 같습니다.