首页 > 科技 >

小白必看!Django 模板语言基础来啦

2019-09-19 10:28:39 暂无 阅读:1743 评论:0
小白必看!Django 模板语言基础来啦
小白必看!Django 模板语言基础来啦

作者 | 单雨

责编 | 胡巍巍

媒介

为了实现模板封装和复用,提高 HTML 界面调试便捷性以及前后端解耦等方针,Django 界说了本身的收集模板说话。

当前介绍模板说话的官方文档已经非常完整,几乎涵盖了斥地中需要用到的常识点和需要注重的问题,但同时官方文档也存在一些问题:

翻译不敷完美,带来阅读的难题;

一些常识点的介绍过于简短,存在大量的页内链接,阅读时需要跳转到分歧的页面,阅读不连贯。

本文基于官方文档系统介绍了 Django 模板说话的根蒂常识点,轻易快速认识 Django 模板说话。

模板系统设计哲学

Django 的模板系统不是简洁的把 Python 嵌入到 HTML 中。

它的设计宗旨是:模板系统旨在展示内容 , 而不是法式逻辑,是以不在 HTML 页面中嵌入 Python。

简洁的说,模板只负责衬着数据,大多数逻辑应该交给视图(view)进行处理。

模板简介

模板是一个简洁的文本文件。它能够生成任何基于文本的花样(如 HTML,XML,CSV 等)。除了根基的 HTML 标签外,模板还包含两种额外的元素——变量和标签。

模板中包含的变量能够被替代为变量的值,标签则被替代为响应的模板掌握逻辑。示例:

django

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}

<h1>{{ section.title }}</h1>

{% for story in story_list %}

<h2>

<a href="{{ story.get_absolute_url }}">

{{ story.headline|upper }}

</a>

</h2>

<p>{{ story.tease|truncatewords:"100" }}</p>

{% endfor %}

{% endblock %}

`{{ section.title }}` 在模板衬着时将会被变量的值替代,for 标签能够实现模板的轮回衬着。

根蒂语法

变量

变量实现从模板上下文字典(返回 HTTP 响应时传递过来的字典)中输出一个值,这是一个雷同于 dict 的对象,包含键值对。当模板引擎碰到一个变量时,它管帐算该变量,并用究竟替代它。

变量名由字母、数字字符和下划线 ( "_" ) 构成,但不克以下划线开首。点 ( "." ) 也显现在变量中,代表属性挪用,变量名中不克有空格或标点符号。

示例:

My first name is {{ first_name }}. My last name is {{ last_name }}.

当传入一个上下文字典 `{'first_name': 'John', 'last_name': 'Doe'}` 时,将会衬着获得:

My first name is John. My last name is Doe.

模板中的变量被字典中的值替代了。

变量还能够使用点透露法实现字典查找、属性查找和列表索引查找等把持:

{{ my_dict.key }}

{{ my_object.attribute }}

{{ my_list.0 }}

点透露法底层道理

当模板系统碰到一个点 , 它会按顺序测验下面的动作:

1. 字典查询

2. 属性或方式查找

3. 数字索引查询

若是究竟值是可挪用的,则挪用该值时将不带参数,挪用的究竟成为新的模板值。

当进行能笼盖字典查找的把持时,这种查找顺序或者会造成一些意想不到的行为。例如:若是试图轮回一个 collection .defaultdict 字典对象:

{% for k, v in defaultdict.items %}

{ 其他把持 }

{% endfor %}

因为字典查找是首先发生的,所以这个行为会先供应一个默认值,而不是使用预期的 .items ( ) 方式。在这种情形下,应该首先考虑使用字典查找,而不是使用字典的属性挪用。

注重

属性平日被注释为一个文本字符串,防止和同名的变量辩说。例如 {{foo.bar}} 中的属性 "bar" 将被注释为一个文本字符串,若是模板上下文中存在变量 "bar",则不会使用该变量的值。

以下划线开首的变量属性或者不克接见,因为它们平日被认为是私有的。

若是引用不存在的变量,模板系统将插入 string_if_invalid 选项的值,该选项默认设置为 "" ( 空字符串 ) 。

标签

标签在模板衬着过程中供应随意逻辑。标签能够输出内容,作为掌握构造,例如 "if" 语句或 "for" 轮回,从数据库获取内容,甚至许可接见其他模板标签。

(1)标签声明

标签的一样形式为:

{% tag %}

{% csrf_token %}

(2)传入参数

{% cycle 'odd' 'even' %}

(3)成对使用的标签

有些标签需要起头和竣事标签:

{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}

(4)常用标签

for:轮回数组中的每个元素 . 好比 , 显露列表 `athlete_list` 中每个元素的 `name` 属性。

<ul>

{% for athlete in athlete_list %}

<li>{{ athlete.name }}</li>

{% endfor %}

</ul>

if 、elif 和 else:在上面,若是 athlete_list 不为空,则 {{athlete_list|length}} 变量将显露活动员的数量。

不然,若是 athlete_in_locker_room_list 不为空,则会显露 "Athletes should be out … " 新闻。若是两个列表都为空,则显露 "No athletes"。

也能够在 if 标签里使用过滤器和各类把持符:

{% if athlete_list|length > 1 %}

Team: {% for athlete in athlete_list %} ... {% endfor %}

{% else %}

Athlete: {{ athlete_list.0.name }}

{% endif %}

固然上面的示例能够工作,然则要注重,大多数模板过滤器都返回字符串,是以使用过滤器进行数学对照平日不会正常工作,而长度是个破例。

(5)更多

Django 有好多内置标签,更多关于内置标签的信息请参考官方文档:

https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-tags

若是需要编写自界说标签,请参考官方文档

https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/howto-writing-custom-template-tags

若是需要对使用的标签和自界说的标签做一份解说文档,能够使用 Django 供应的文档对象,详情请参考:

https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/admin/admindocs/

过滤器

简介

过滤器能够对变量做一些把持,例如给变量赋值,改变变量的值等。

点窜变量显露

过滤器能够点窜变量的显露。例如:

{{ name|lower }}

经由过滤器 lower 变量 {{ name }} 变为了小写字符,经由管道符 ( | ) 距离变量和过滤器来使用过滤器。

链式挪用过滤器

一个过滤器的输出能够作为下一个过滤器的输入。

{{ text|escape|linebreaks }} 是一种常用的转换体式 , 在这之后换行符被替代为了 <p> 标签。

转换变量和标签参数

过滤器转换变量和标签参数的值。示例:

{{ django|title }}

传入 `{'django': 'the web framework for perfecalist With deadline '}` 上下文字典时,该模板呈现为:

The Web Framework For Perfectionists With Deadlines

传入参数给过滤器

示例 1:

{{ my_date|date:"Y-m-d" }}

my_date 将会被替代为当前日期。

示例 2:

django

{{ bio|truncatewords:30 }}

将会会显露 `bio` 变量的前 30 个字符

注重

过滤器参数中若是包含空格和标点符号,必需使用引号 "" 括起来,例如,要用逗号和空格保持列表,能够使用 {{list|join:", "}}。

Django 供应了大约 60 个内置模板过滤器,请参考官方文档:

https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-filters,

下面列举一些常用的过滤器:

default

若是变量为 false 或空,则使用给定的默认值。不然,使用变量的值。例如:

{{ value|default:"nothing" }}

若是 `value` 没有供应或许为空,那么将它显露为 "`nothing`" 。

length

返回值的长度。这对字符串和列表都适用。例如:

{{ value|length }}

若是 `value` 为 ` [ 'a', 'b', 'c', 'd' ] `, 那么他将被显露为 `4`。

filesizeformat

将值花样化为 " 人类可读的 " 文件巨细 ( 即 "13kb"、"4.1 MB"、"102 字节 " 等 ) 。例如:

{{ value|filesizeformat }}

若是值为 123456789,则输出为 117.7 MB。

若是需要自界说过滤器,请参考请官方文档:

https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/

注释

单行注释

{ this won't be rendered }

多行注释:{% comment %} 和 {% endcomment %}

<p>Rendered text with {{ pub_date|date:"c" }}</p>

{% comment "Optional note" %}

<p>Commented out text with {{ create_date|date:"c" }}</p>

{% endcomment %}

注重:Comment 标签不克嵌套使用。

作者简介:单雨,90 后工科男,伪文艺青年。今朝就读于北京理工大学宇航系,喜欢研究 AI,收集爬虫,微信小法式以及机械人,痴迷于 Coding,睡前必撸码。

相关文章