장고의 템플릿 (M)

첫째, 일반적인 구문

장고는 두 개의 특수 기호를 기억해야 템플릿 :

{{}}과 {%} %

{}는 {} 값이 템플릿을 렌더링 할 때,이 {} % % 논리적 관계의 작동을 나타내는 대체 변수를 나타낸다.

변수

구문 : 변수 이름}} {{

변수 이름은 영숫자와 밑줄로 구성되어 있습니다.

도트 (.) 객체의 인수 속성에 해당하는 템플릿 언어의 특별한 의미를 가지고 있습니다.

몇 가지 예 :

뷰 코드 :

def template_test(request):
    l = [11, 22, 33]
    d = {"name": "孙悟空"}

    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def dream(self):
            return "{} is dream...".format(self.name)

    sun = Person(name="孙悟空", age=34)
    zhu = Person(name="猪八戒", age=90)
    sha = Person(name="沙和尚", age=18)

    person_list = [sun, zhu, sha]
    return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})

템플릿 지원 표현 :

{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}

참고 : 시스템 템플릿을 발견하면 조회 할 수있는 다음과 같은 순서에있을 것입니다 (.) :

  1. 사전에 쿼리
  2. 속성 또는 메서드
  3. 인덱스 번호 (아니, 즉 뒷면에서 찾을 수 없음은 부정적이다)

두, Filters-- 필터

필터의 번역, 수정 변수의 결과를 표시한다.

구문 : {{값 | FILTER_NAME : 매개 변수}} ''더 공간이 남아 있지

태만

{{ value|default:"nothing"}}

값이 전달되지 않은 경우, 값은 아무것도 표시되지 않습니다

참고 : '찾기'(기본값보다 높은 우선 순위)의 기본 동작을 대체 할 수 string_if_invalid : 옵션은 옵션을 추가 할 수있는 템플릿.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(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',
            ],
            'string_if_invalid': '找不到'
        },
    },
]

filesizeformat

는 "사람이 읽을 수있는"파일 크기 (예를 들어, '13 KB ','4.1 MB ','102 바이트 '등)로 포맷 된 값입니다. 예를 들면 :

{{ value|filesizeformat }}

값이 123456789 인 경우, 출력은 117.7 MB 될 것입니다.

더하다

또한 대해 +에 대응하는 변수 패러미터에 첨가하고, 접합 디지털 문자열 결합리스트

{{ value|add:"2" }}

(4) 디지털 값이고, 출력은 6이다.

{{ first|add:second }}

상기 제 [1, .2,3] 인 경우, 두 번째는 [4,5,6]이고, 그 결과는 출력 [1,2,3,4,5,6]이다.

상부 하부 与

소문자

{{ value|lower }}

자본

{{ value|upper}}

표제

표제

{{ value|title }}

밝은 rjust 중앙

좌회전

"{{ value|ljust:"10" }}"

오른쪽 정렬

"{{ value|rjust:"10" }}"

센터

"{{ value|center:"15" }}"

길이

{{값 | 길이}}

길이 값, 예컨대 값 = 'A', 'B', 'C', 'D']로하고, (4)는 표시를 리턴한다.

일부분

슬라이스 및 Python 방법과 동일한 방법을 사용하여 슬라이스는 스텝 크기를 제공 할 수있다

{{value|slice:"2:-1"}}

첫째, 마지막

첫 번째 요소를 가지고

{{ value|first }}

마지막 요소를 가지고

{{ value|last }}

어울리다

문자열 연결 목록을 사용하여. 파이썬 (목록)로 str.join.

{{ value|join:" // " }}

truncatechars, truncatewords

문자의 문자열이 지정된 문자 수를 초과하는 경우, 그것은 잘립니다. 번역 문자열을 생략의 끝에서 순서를 잘립니다 ( "...").

参数:截断的字符数
{{ value|truncatechars:9}}
参数:截断的单词数(空格区分)
{{ value|truncatewords:9}}

날짜

날짜 형식

{{ value|date:"Y-m-d H:i:s"}}

구성의 설정은 기본 형식을 변경 :

USE_L10N = False
DATETIME_FORMAT = 'Y-m-d H:i:s'

출력 형식의 문자 : 보려면 클릭하세요 .

안전한

JS와 HTML 태그 분명한 이유 장고 템플릿이 자동으로 이스케이프 구문 태그 것, 이것은 안전을위한 것입니다. 그러나 때때로 우리는 이러한 수정은 HTML 수정을 편집 비슷한 FCKEDITOR에 의해 발생 될 수 있습니다 수정, 이러한 HTML 요소, 예를 들어, 우리는 콘텐츠 관리 시스템을, 이스케이프 원하는 문서의 배경을 추가 할 수 있습니다 텍스트, 소스 파일이 HTML 태그를 보호하는 경우 자동으로 표시 탈출했다. 우리가 필터링 할 수 있습니다 하나의 변수 인 경우, 자동 장고는 두 가지 방법으로 HTML을 탈출 해제하려면 |이 코드를 확보하기 위해 장고 "안전한"방법을 이야기하는 것은 벗어날 필요가 없습니다.

예를 들면 :

value = "<a href='#'>点我</a>"
{{ value|safe}}

평 파일 (안전 사용의 필요성에 HTML) 금고에 제공됩니다 :

from django.utils.safestring import mark_safe
'a':mark_safe('<a href="http://www.baidu.com">百度</a>')
{{ a }}

셋째, 사용자 정의 필터

하나 또는 두 개의 매개 변수 파이썬 기능을 사용자 정의 필터 :

  • (입력)의 값은 - - 반드시 문자열이 아닌
  • 매개 변수의 값 - 기본값을, 또는 완전히 생략 할 수 있습니다,

예를 들어, 필터에 {{var에 | foo는 "바 "}} , 필터 변수 통과 VAR 및 매개 변수 "바" .

사용자 정의 필터 코드 파일의 위치 :

app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一个package package
        __init__.py
        app01_filters.py  # 建一个存放自定义filter的py文件
    views.py

사용자 정의 필터를 작성 :

from django import template
register = template.Library()

@register.filter
def fill(value, arg):
    return value.replace(" ", arg)

@register.filter(name="addSB")  # 起了个别名
def add_sb(value):
    return "{} SB".format(value)

사용자 정의 필터를 사용 :

{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}

{# 使用我们自定义的filter #}
{{ somevariable|fill:"__" }}
{{ d.name|addSB }}

두, 태그의 태그

...에 대한

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

루프 매개 변수에 대한 사용할 수 있습니다 :

변하기 쉬운 기술
forloop.counter 전류 루프 인덱스 값 (1부터)
forloop.counter0 전류 루프 인덱스 값 (제로)
forloop.revcounter 역방향 전류 루프 인덱스 (단 1)
forloop.revcounter0 (단, 0) 현재의 인덱스 값을 순환 역방향
forloop.first 현재 사이클의 첫 번째 사이클 아니다 (부울 값)
forloop.last 현재주기 마지막 사이클하지 않습니다 (부울 값)
forloop.parentloop 외부 루프 사이클이 층

용 빈

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li> //for循环取不出数据时显示
{% endfor %}
</ul>

... ELIF 다른 和 경우

{% if user_list %}
  用户人数:{{ user_list|length }}
{% elif black_list %}
  黑名单数:{{ black_list|length }}
{% else %}
  没有用户
{% endif %}

다른 경우라면

{% if user_list|length > 5 %}
  七座豪华SUV
{% else %}
    黄包车
{% endif %}

문 지지체는 경우 , 또는 , == , > , < , ! =, <= , > =, , 하지에 , IS , 아니다 판단

중간 변수의 정의

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}
//或
{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

csrf_token

이 태그는 CSRF 보호를 사용한다.

페이지의 형태로 형태로 된 기록 {% csrf_token %}

주의

{# ... #}

주의 사항

  1. 장고 템플릿 언어는 다음과 같은 문구를 지원하지 않는 지속적인 판단을 지원하지 않습니다
{% if a > b > c %}  // 使用a > b and b > c
...
{% endif %}
  1. 장고 템플릿 언어의 우선 순위 속성은 방법보다 더 크다
def xx(request):
    d = {"a": 1, "b": 2, "c": 3, "items": "100"}
    return render(request, "xx.html", {"data": d})

페이지를 렌더링하기 위해이 방법을 렌더링 사용하는 경우 위와 같이, 사전 D 키 항목을 통과하고 기본 d.items () 메소드, 템플릿 언어에있는이 시간이있다 :

{{ data.items }}

기본 항목 키는 D를 취할 것입니다.

셋째, 마더 보드

첫째, 마더 보드를 추출

  1. HTML 페이지는 여러 페이지의 공용 부분을 추출
  2. 여러 블록 블록은 하위 페이지 범위를 입력 할 필요가 정의
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Title</title>
  {% block page-css %}  //母板的CSS样式位置
  
  {% endblock %}
</head>
<body>

<h1>这是母板的标题</h1>
{% block page-main %}

{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}

{% endblock %}
</body>
</html>

주 : 일반적으로, 블록 및 서브 - 페이지 교체를 용이하게하기 위해 마더 보드의 CSS JS 블록에 특별한 페이지를 정의한다.

둘째, 마더 보드를 상속

하위 페이지 마더 상속 페이지 상단 다음 구문을 사용.

{% extends 'layouts.html' %}  // 带上引号   不带的话会当做变量
// 重写block块 ,写在block内部

셋째, 블록 (블록)

마스터를 이용하여 {% block xxx %}정의하는 방법 "블록."

하위 페이지에 마더 보드에 대응하는 블록 이름의 내용을 정의하는 마더 보드를 교체 대응한다.

{% block page-main %}
  <p>一</p>
  <p>二</p>
  <p>三</p>
{% endblock %}

넷째, 구성 요소

종래 내비게이션 페이지 콘텐츠로서 꼬리말 정보 요소는 별도의 파일에 저장 될 수 있고, 그리고 필요한 곳에 사용될 수있는 다음과 같은 구문에 도입.

{% include 'navbar.html' %}

다섯째, 정적 파일 관련

{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

JS 파일을 참조 할 때 사용합니다 :

{% load static %}
<script src="{% static "mytest.js" %}"></script>

파일에 사용 된 대부분의 변수로 저장할 수 있습니다 :

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>

get_static_prefix 사용

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

또는

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />

여섯 사용자 정의 simpletag

사용자 정의 필터 등,보다 유연한 매개 변수를 수신 할 수있다

등록 정의 simpletag입니다 :

@register.simple_tag
def plus(a, b, c):
    return "{} + {} + {}".format(a, b, c)

사용자 정의 간단한 태그를 사용합니다 :

{% load app01_demo %}

{# simple tag #}
{% plus "1" "2" "abc" %}

七, inclusion_tag

HTML 코드는 동적 반환 단편 사용

예 :

// templatetags/my_inclusion.py

from django import template

register = template.Library()

@register.inclusion_tag('result.html')
def show_results(n):
    n = 1 if n < 1 else int(n)
    data = ["第{}项".format(i) for i in range(1, n+1)]
    return {"data": data}

템플릿 / result.html :

<ul>
  {% for choice in data %}
    <li>{{ choice }}</li>
  {% endfor %}
</ul>

템플릿 / index.html을 :

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>inclusion_tag test</title>
</head>
<body>

{% load my_inclusion %}

{% show_results 10 %}
</body>
</html>

추천

출처www.cnblogs.com/zyyhxbs/p/11432524.html