English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Django 템플릿 시스템

 Django는 Python과 HTML을 별도로 분리하여 Python 코드를 처리할 수 있습니다./변수는 뷰와 HTML 템플릿으로 이동합니다. 이 두 가지를 연결하려면 Django는 렌더링 함수와 Django 템플릿 언어에 의존합니다.

렌더링 함수

이 함수는 세 가지 매개변수를 가집니다 −

요청− 초기화 요청템플릿 경로 − 이는 프로젝트 settings.py 파일의 TEMPLATE_DIRS 옵션에 대한 상대 경로입니다.파라미터 딕셔너리 − 딕셔너리는 템플릿에 필요한 모든 변수를 포함하고 있습니다. 이 변수는 뷰에서 선언된 모든 지역 변수를 통해 생성하거나 locals()를 사용하여 사용할 수 있습니다.

Django 템플릿 언어(DTL)

Django 템플릿 엔진은 사용자측면에 대한 애플리케이션을 정의하기 위해 작은 언어를 제공합니다.

변수 표시

변수는 다음과 같이 표시됩니다: {{variable}}. 템플릿은 뷰에서 render 함수의 세 번째 매개변수로 전달된 변수로 대체됩니다.让我们改变 hello.html 显示当天的日期 :

hello.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
<html> 
    <body>
       Hello World!!!<p>Today is {{today}}</p>
    </body> 
 </html>

그런 다음, 우리의 뷰는 다음과 같이 변경됩니다. -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
def hello(request):
    today = datetime.datetime.now().date()
    return render(request, "hello.html", {"today": today})

이제, URL을 통해 접근할 때 다음과 같은 출력을 받게 됩니다. /myapp/hello 이후 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
Hello World!!!
 Today is Sept. 11, 2015

당신이 이미 알고 있듯이, 변수가 문자열이 아니면 Django는 __str__ 메서드를 사용하여 표시하며, 같은 원칙으로 Python에서 사용하는 것처럼 객체의 속성에 접근할 수 있습니다. 예를 들어: 날짜의 연도를 표시하려면, 여기서 변수는 다음과 같습니다.: {{today.year}}.

필터

이 필터는 수정된 변수를 표시하는 데 도움이 됩니다. 필터 구조는 다음과 같습니다.: {{var|filters}}.

간단한 예제 −

{{string|truncatewords:80}} − 필터는 문자열을 자르기 때문에 전체를 볼 수 없습니다.80个字符。

       {{string|lower}} − 转换字符为小写            {{string|escape|linebreaks}} − 转义字符串内容,然后换行转换为标签。    

还可以设置默认的变量。

标签

标签可以执行以下操作:if 条件,for循环,模板继承以及更多。

if标签

就像在Python中,你可以使用if,else和elif在模板中 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       Hello World!!!<p>Today is {{today}}</p>
       We are
       {% if today.day == 1 }%
       the first day of month.
       {% elif today == 30 %}
       the last day of month.
       {% else %}
       I don't know.
       {% endif %}
    </body>
 </html>

在这个新的模板,根据当天的日期,该模板将呈现这个值。

for标签

就像'if',我们有 'for' 标签,这些完全像在Python中一样使用它们。让我们改变 hello视图列表发送到我们的模板 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
def hello(request):
    today = datetime.datetime.now().date()
    daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})

该模板用来显示列表 {{ for }} −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       Hello World!!!<p>Today is {{today}}</p>
       We are
       {% if today.day == 1 }%
       the first day of month.
       {% elif today == 30 %}
       the last day of month.
       {% else %}
       I don't know.
       {% endif %}
       <p>
          {% for day in days_of_week %}
          {{day}}
       </p>
 
       {% endfor %}
    </body>
 </html>

我们应该得到输出的内容如下 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
Hello World!!!
 Today is Sept. 11, 2015
 We are I don't know.
 Mon
 Tue
 Wed
 Thu
 Fri
 Sat
 Sun

块和扩展标签

模板系统是不完整模板继承。当您设计模板的含义,子模板会根据自己的需要填写一个主模板,就像一个页面中所选选项卡可能需要一个特殊的CSS。

让我们修改 hello.html 模板来从 main_template.html 继承。

main_template.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
<html>
    <head> 
       <title>
          {% block title %}Page Title{% endblock %}
       </title> 
    </head>
 
    <body> 
       {% block content %}
          Body content
       {% endblock %} 
    </body>
 </html>

hello.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
{% extends "main_template.html" %}
 {% block title %}My Hello Page{% endblock %}
 {% block content %}
 Hello World!!!<p>Today is {{today}}</p>
 We are
 {% if today.day == 1 }%
 the first day of month.
 {% elif today == 30 %}
 the last day of month.
 {% else %}
 I don't know.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}

위의 예제에서, 호출할 때 /myapp/hello, 우리는 여전히 같은 결과를 얻을 것입니다. 하지만 지금은 확장을 통해 코드를 재구성하지 않습니다.-−

main_template.html에서 블록 태그를 정의합니다. 타이틀 블록은 페이지 타이틀을 포함하고, 내용 블록은 페이지 주요 내용을 포함합니다. Home.html에서 main_template.html을 확장 상속하여 사용할 경우, 위의 블록 정의(내용과 타이틀)를 사용합니다.

주석 태그

주석 태그는 템플릿 정의 주석을 위해 사용되며, HTML 주석이 아닙니다. 이는 파일이나 단一行 코드의 주석일 수 있습니다.