Python3 --- Django创建模板

本文详细介绍了Django模板语言,包括模板的用途、创建过程和主要内容。重点讲解了变量的使用,如字典查询、属性查询、数字索引查询,并阐述了模板中的标签功能,如autoescape、block、comment、crsf_token等,以及过滤器的应用,如add、filesizeformat、safe等。此外,还提到了模板中的注释和自定义过滤器及标签的实现。

一、模板介绍

        模板是一个文本,用于分离文档的表现形式和内容。 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。 模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。

创建文件夹:在应用中创建templates文件夹

创建文件:在templates文件夹中创建页面文件


模板语言包含如下内容:

  • 变量
  • 标签
  • 过滤器
  • 注释


二、变量

语法:{{variable}}

注意事项:

  • 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出
  • 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
  • 当模版引擎遇到点("."),会按照下列顺序查询:
    • 字典查询,例如:foo["bar"]
    • 属性或方法查询,例如:foo.bar
    • 数字索引查询,例如:foo[bar]
  • 如果变量不存在, 模版系统将插入'' (空字符串)
  • 在模板中调用方法时不能传递参数

例如:

{{hero.showName}}


三、标签(标签和过滤器官方文档

3.1、autoescape

控制当前的自动转义行为,此标记采用on或者off作为参数,并确定自动转义是否在块内有效。该块以endautoescape结束标签关闭。

{% autoescape on %}
    {{ body }}
{% endautoescape %}

3.2、block

定义可以被子模板覆盖的块,为模板继承时使用

示例:

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% block head %}
    {% endblock %}
</head>
<body>
<h1>logo</h1>
<hr>
{% block content%}
    <h1>abc</h1>
{% endblock %}
<hr>
<h1>contact</h1>
</body>
</html>

index.html继承base.html

{% extends 'booktest/base.html' %}
{% block content %}
<h1>123</h1>
{% endblock content %}


3.3、comment

注释,{% comment %} 和 {% endcomment %}之间的内容被解释为注释

3.4、crsf_token

一个防止CSRF攻击(跨站点请求伪造)的标签

3.5、cycle

多次循环迭代,给定的值,每次遇到此标签就会生成一个参数对应第一个,如此类推,如循环完没有参数了则继续从头开始循环。

<ul>
    <li>{% cycle 'one' 'two' 'three' 'four' as infocycle %}</li>
    <li>{% cycle infocycle %}</li>
    <li>{% cycle infocycle %}</li>
    <li>{% cycle infocycle %}</li>
    <li>{% cycle infocycle %}</li>
    <li>{% cycle infocycle %}</li>
    <li>{% cycle infocycle %}</li>
</ul>

3.6、debug

输出整个调试信息,包括当前上下文和导入的模块。

3.7、extends

表示该模板扩展了父模板,这个标签有两种使用方式:

  • "base.html"作为父模板的名称来扩展

{% extends "base.html" %}

  • 使用的变量variable。如果变量的计算结果为字符串,Django将使用该字符串作为父模板的名称。如果变量评估为一个Template对象,Django将使用该对象作为父模板。

{% extends variable %}
3.8、filter

通过一个或多个过滤器对内容过滤。 作为灵活可变的语法,多个过滤器被管道符号相连接,且过滤器可以有参数。
注意块中所有的内容都应该包括在filter 和endfilter 标签中。

{% filter force_escape|lower %}
    ...
{% endfilter %}

3.9、firstof

输出第一个值不等于False的变量

{% firstof var1 var2 var3 %}

如果所有传递的变量都是False,还可以使用文字字符串作为返回值

{% firstof var1 var2 var3 "fallback value" %}

3.10、for

循环输出数组中的每个项目,使项目在上下文变量中可用。

循环列表的值:

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

可以使用reversed反向循环列表:

<ul>
{% for item in list reversed %}
    <li>{{ item }}</li>
{% endfor %}
</ul>
列表可以使用嵌套循环:

<ul>
{% for x in list %}
{% for y in x %}
    <li>{{ y }}</li>
{% endfor %}
{% endfor %}
</ul>
字典循环,可以使用items方法得到字典的建和值:

<ul>
{% for k,v in row.items %}
    <li>{{ k }}={{ v }}</li>
{% endfor %}
</ul>
for循环再循环中设置的变量:
  • forloop.counter --- 循环的当前迭代索引从1开始计数
  • forloop.counter0 --- 循环当前迭代的索引从0开始计数
  • forloop.revcounter --- 循环结束时的迭代次数(1索引)
  • forloop.revcounter0 --- 循环结束时的迭代次数(0索引)
  • forloop.first --- 如果这是通过循环的第一次,则为真
  • forloop.last --- 如果这是通过循环的最后一次,则为真
  • forloop.parentloop --- 对于嵌套循环,这是围绕当前循环的循环

<body>
<ul>
    {% for i in li %}
    <li>{{ forloop.counter }}:{{ i }}</li> <!--从1开始索引计数--> 
    {% endfor %}
</ul>
<br />
<ul>
    {% for i in li %}
    <li>{{ forloop.counter0 }}:{{ i }}</li> <!--从0开始索引计数--> 
    {% endfor %}
</ul>

<ul>
    {% for i in li %}
    <li>{{ forloop.revcounter }}:{{ i }}</li> <!--从1开始反索引计数--> 
    {% endfor %}
</ul>

<ul>
    {% for i in li %}
    <li>{{ forloop.counter0 }}:{{ i }}</li> <!--从0开始反索引计数--> 
    {% endfor %}
</ul>

<ul>
    {% for i in li %}
        {% if forloop.first %} <!--判断是通过循环第一次则添加类名-->
            <li class="first">
        {% else %}
            <li>
        {% endif %}
        {{ i }}
        </li>
    {% endfor %}
</ul>

<ul>
    {% for number in li %}
        {{ number }}
        {% if not forloop.last %} <!--判断不是最后一个索引则加逗号-->
            ,
        {% endif %}
    {% endfor %}
</ul>
</body>

for   empty:如果给定的数组为空或无法找到,则for标签可以接受一个可选的子句,显示文本:{% empty %}

<ul>
    {% for number in li1 %}
        {{ number }}
    {% empty %}
        <li>sorry ,no number in this li1.</li> <!--判断如果迭代找不到活变量不存在则输出empty的文本内容-->
    {% endfor %}
</ul>
3.11、if

条件语句

{{ po }}
{% if po >= 90 %}
    <h1>优秀:{{ po }}</h1>
{% elif po >= 80 %}
    <h1>良好:{{ po }}</h1>
{% elif po >= 70 %}
    <h1>一般:{{ po }}</h1>
{% elif po >= 60 %}
    <h1>及格:{{ po }}</h1>
{% else %}
    <h1>不及格:{{ po }}</h1>
{% endif %}

说明:

  • if标签可以使用and,or或not以测试多个变量或否定一个给定的变量,允许在同一个标签中使用两个and和or子句,and优先级高于or。
  • if标签还可以使用==,!=,<,>,<=,>=,in等运算符。
  • 表达式的优先级从低到高:or - and - not - in -  ==,!=,<,>,<=,>=

3.12、ifchanged

检测一个值在循环的最后有没有改变,所以这个标签实在循环里面是用的,有两个用法:

  • 没有接受参数时,比较的是ifchange标签里面的内容相比以前是否有变化,有变化时生效
  • 接受一个或以上各参数的时候,如果有一个或者以上的参数发生变化时,有变化时生效
ifchanged可以有else标签

{% for match in matches %}
    <div style="background-color:
        {% ifchanged match.ballot_id %}
            {% cycle "red" "blue" %}
        {% else %}
            grey
        {% endifchanged %}
    ">{{ match }}</div>
{% endfor %}
3.13、ifequal

仅当两个参数相等的时候输出块的内容,可以配合else输出

{% ifequal user.username "adrian" %}
    ...
{% endifequal %}
3.14、ifnotequal

与ifequal相反

3.15、include

加载一个模板并用当前上下文(include该模板的模板的上下文)渲染它,接受一个变量或者字符串参数
当然你也可以在include的时候传递一些参数进来

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}
如果你只想接受传递的参数,不接受当前模板的上下文时,你可以是用only参数

{% include "name_snippet.html" with greeting="Hi" only %}
3.16、load

加载标签库

3.17、now

显示当前的时间日期,接受格式化字符串的参数

3.18、regroup

通过共同的属性对一个列表的相似对象重新分组,加入你有一个城市(city)的列表如下

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]


{% regroup cities by country as country_list %}

<ul>
{% for country in country_list %}
    <li>{{ country.grouper }}
    <ul>
        {% for item in country.list %}
          <li>{{ item.name }}: {{ item.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>
值得注意的是,regroup并不会重新排序,所以,请确保city在regroup之前已经按country排好序,否则将得不到你预期想要的结果,如果不确定可以用dictsort过滤器排序

{% regroup cities|dictsort:"country" by country as country_list %}
3.19、spaceless

移除html标签之间的空格,注意是标签之间的空格,标签与内容之间的空格不会被删除

{% spaceless %}
    <p>
        <a href="foo/">Foo</a>
    </p>
{% endspaceless %}

结果如下:

<p><a href="foo/">Foo</a></p>

3.20、ssi

在页面上输出给定文件的内容

{% ssi /home/html/ljworld.com/includes/right_generic.html %}
使用parsed参数可以使得输入的内容可以作为一个模板从而可以使用当前模板的上下文

{% ssi /home/html/ljworld.com/includes/right_generic.html parsed %}
3.21、url

反向解析

<!--
    url的参数:
    第一个参数是url地址,包含如下:
        booktest为url的namespace
        show为url的name

    第二个参数开始是show中需要传递的参数
-->
<a href="{% url 'booktest:show' '123' %}"></a>


urlpatterns = [
    path(r'admin/', admin.site.urls),
    path(r'booktest/', include('booktest.urls',namespace='booktest')),
]

3.22、widthratio

这个标签计算给定值与最大值的比率,然后把这个比率与一个常数相乘,返回最终的结果

<img src="bar.gif" height="10" width="{% widthratio this_value max_value 100 %}" />
3.23、 with

用更简单的变量名缓存复杂的变量名

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

尽管初衷是这样,但你不必都是如此,哈哈

{% with alpha=1 beta=2 %}
    ...
{% endwith %}


四、过滤器标签和过滤器官方文档

4.1、add

给变量加上相应的值

{{ value|add:"2" }}
此过滤器将首先尝试将这两个值强制为整数。如果失败,它会尝试将值加在一起。这将适用于某些数据类型(字符串,列表等),并在其他数据类型上失败。如果失败,结果将是一个空字符串。

4.2、addslashes

给变量中的引号(双引号、单引号)前加上斜线

{{ "i'm using django"|addslashes }}

#输出为:
i\'m using django
4.3、capfirst

大写该值的第一个字符,如果第一个字符不是字母,则此过滤器不起作用。

{{ "i'm using django"|capfirst }}

#输出为:
I'm using django
4.4、center

将值置于给定宽度的字段中

"{{ "django"|center:"30" }}"
4.5、cut

从字符串中移除指定的字符

{{ "django"|cut:"j" }}
4.6、 date

根据给定的格式格式化日期。

{{ date|date:"Y-m-d H:i:s w" }}
Y:4位年;m:月;d:日;H:24小时时;i:分钟;s:秒;w:星期,从0开始表示星期日

4.7、default

如果变量值为false,则使用给定的默认值,否则使用该值。

{{ value|default:"nothing" }}
4.8、 default_if_none

如果值是None,则使用给定的默认值,否则,使用该值。

{{ value|default_if_none:"nothing" }}
4.9、 dictsort

根据参数中给出的关键字列出字典并返回该列表。

市场场景,可以更加某个属性进行数据排序重组:

[
    {'title': '1984', 'author': {'name': 'George', 'age': 45}},
    {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
    {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]

{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}
4.10、 dictsortreversed

获取字典列表并返回该列表按照参数中给出的建以相反顺序排序,这与上面的过滤器完全相同,但返回的值将按相反顺序排列。

4.11、divisibleby

是否能够被某个数字整除,是的话返回True,否则返回False

{{ 9|divisibleby:"3" }}  #返回true
4.12、 escape

对字符串进行转义。django默认自动转义,如果我们关闭了自动转义,这可使用escape过滤器来转义:

  • < 转换为 &lt;
  • > 转换为 &gt;
  • ' (单引号)转换为 &#39;
  • " (双引号)转换为 &quot;
  • & 转换为 &amp;

4.13、escapejs

替换value中的某些字符,以适应JAVASCRIPT和JSON格式

4.14、filesizeformat

格式化文件大小显示

{{ 123456|filesizeformat }}

#输出:
120.6 KB
4.15、 first

返回列表中的第一个值

{{ value|first }}
4.16、 last

返回列表中的最后一个值

4.16、floatformat

格式化浮点数

4.17、force_escape

将HTML转义应用于字符串

4.18、get_digit

给定一个整数,返回请求的数字,其中1是最右边的数字,2是第二个最右边的数字等。返回无效输入的原始值(如果输入或参数不是整数,或者如果参数小于1)。否则,输出总是一个整数。

{{ po|get_digit:"2" }}
4.19、 json

使用字符串链接列表元素

{{ lis|join:"++" }}
4.20、 length

返回字符串或者列表的长度

{{ 'abcdefg'|length }}
4.21、 length_is

比较字符串或者列表的长度

{{ 'abcdefg'|length_is:"7" }}
4.22、 linebreaks

将纯文本中的换行符转换成HTML中的换行符。

value = ‘Joel\nis a slug’

{{ value|linebreaks }}

#output:
Joel
is a slug
4.23、 linebreaksbr

将纯文本中的所有换行符转换为HTML换行符。

4.24、linenumbers

用行号显示文本。

{{ value|linenumbers }}
4.24、 lower

将字符串转换为全部小写。

{{ 'ABCD'|lower }}
4.25、 make_list

返回转换为列表的值,将字符串转换为列表。

{{ value|make_list }}

#output:
['D', 'j', 'a', 'n', 'g', 'o']
4.26、 phone2numeric

将电话号码(可能包含字母)转换为数字等值。

{{ '800-COLLECT'|phone2numeric }}

#output:
800-2655328
4.27、 pluralize

如果值不为1,则返回复数后缀,默认情况下,该后缀为‘s'。

4.28、pprint

一个包装,用于调试。

4.29、random

返回给定列表中的一个随机元素。

4.30、rjust

在给定宽度的字段中右对齐该值。

4.31、safe

将字符串标记为在输出之前不需要进一步的HTML转义,自动转义关闭时,此过滤器不起作用。

{{ value|safe }}
4.32、 safeseq

将safe过滤器应用于序列的每一个元素,结合使用序列操作的其他过滤器很有用。

4.33、slice

返回列表的一部分,使用与python列表切片相同的语法。

lis = [1,2,3,4,5]

{{ lis|slice:":2" }}

#output
[1, 2]
4.34、 slugify

转换为ASCII。将空格转换为连字符。删除非字母数字,下划线或连字符的字符。转换大写为小写。也剥去前导和尾随空白。

value = '   Django IS %a *fsd_dsf-kkk  '

{{ value|slugify }}

#output:
django-is-a-fsd_dsf-kkk
4.35、 stringformat

根据参数格式化变量,这是一个字符串格式化说明符,说明符使用printf风格的字符串格式语法,除了前面的“%”。

value = 10.1

{{ value|stringformat:"d" }}

#output:
#输出整数
10
4.36、 striptags

去除所有HTML标签

value = "<b>Joel</b> <button>is</button> a <span>slug</span>"

{{ value|striptags }}

#output
Joel is a slug
4.37、 time

根据给定的时间格式,格式化输出时间

Y:4位年;m:月;d:日;H:24小时时;i:分钟;s:秒;w:星期,从0开始表示星期日

date = datetime.datetime.now()

<li>{{ date }}</li>
<li>{{ date|time:"H:i:s" }}</li>

#output
May 21, 2018, 12:33 p.m.
12:33:50
4.38、 timesince

将日期格式化为自该日期以来的时间(例如,“4天,6小时”)。

4.39、timeuntil

类似于timesince,除了它测量从现在开始直到给定日期或日期时间的时间

4.40、title

将字符串转换为标题,方法是让单词以大写字母开头,其余字符以小写字母开头。这个标签不会保留小写字母。

<li>{{ "i am mr's zhang"|title }}</li>

#output
I Am Mr's Zhang
4.41、 truncatechars

如果字符串长于指定的字符数,则截断字符串。截断的字符串将以可转换的省略号序列(“...”)结尾。

<li>{{ "i am mr's zhang"|truncatechars:5}}</li>

#output
i ...          #总长度保留5位

4.42、truncatechars_html

类似于truncatechars,它知道HTML标记。在截断点之后立即关闭在字符串中打开并且在截断点之前未关闭的任何标记。

4.43、truncatwords

在一定数量的单词之后截断一个字符串。

<li>{{ "i am mr's zhang"|truncatewords:3}}</li>

#output
i am mr's ...
4.44、truncatewords_html

truncat类似于truncatewords,它知道HTML标记。任何在字符串中打开且在截断点之前未关闭的标记在截断后立即关闭。这比效率低truncatewords,因此只能在传递HTML文本时使用。ewords_html

4.45、unordered_list

递归地获取自嵌套列表并返回一个HTML无序列表 - 无需打开和关闭<ul>标记

var =  ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]

{{ var|unordered_list }}


#output
<li>States
    <ul>
        <li>Kansas
        <ul>
            <li>Lawrence</li>
            <li>Topeka</li>
        </ul>
        </li>
        <li>Illinois</li>
    </ul>
</li>
4.46、 upper

将字符串转换为全部大写。

4.47、urlencode

转义在URL中使用的值。

var1 =  "https://www.baidu.com/obj?a=b&b=d"

<li>{{ var1|urlencode }}</li>
<li>{{ var1|urlencode:"" }}</li>  #当所有字符都应该转义时可使用空字符串

#output:
https%3A//www.baidu.com/obj%3Fa%3Db%26b%3Dd
https%3A%2F%2Fwww.baidu.com%2Fobj%3Fa%3Db%26b%3Dd
4.48、 urlize

将文本中的网址和电子邮件地址转换为可点击的链接。

<li>{{ "http://www.baidu.com"|urlize }}</li>
<li>{{ "check out www.baidu.com"|urlize }}</li>
<li>{{ "Send questions to foo@example.com"|urlize }}</li>


#output
http://www.baidu.com
check out www.baidu.com
Send questions to foo@example.com
4.49、 urlizetrunc

将URL和电子邮件地址转换为可点击链接,就像urlize一样,但会截断超过给定字符数限制的URL。

<li>{{ "check out www.djangoproject.com more"|urlizetrunc:18 }}</li>

#output
check out www.djangoproje... more
4.50、 wordcount

返回单词的数量

<li>{{ "check out django project more"|wordcount }}</li>

#output
5
4.51、 wordwrap

用指定的行长包装单词。

{{ "django project more"|wordwrap:5 }}
4.52、yesno

将“true”、“false”和“可选”值映射到字符串“yes”、“否”、“可能”或以逗号分隔的列表传递的自定义映射,并根据值返回这些字符串中的一个字符串。

<li>{{ "True"|yesno:"yeah,no,maybe" }}</li>
<li>{{ "False"|yesno:"yeah,no,maybe" }}</li>


五、注释

5.1、单行注释

{#...#}

5.2、多行注释

{% comment %}
...
{% endcomment %}


六、自定义过滤器和标签

from django import template
from django.utils.safestring import mark_safe

# 名字必须为register
register = template.Library()


# 自定义过滤器
@register.filter
def format_str(a, b):
    return a + "=%=" + b


# 自定义标签
@register.simple_tag
def my_tag(a, b, c):
    return a * b * c


{% if '123'|format_str:'456' == '123=%=456' %}
    <p>Hello Geek!</p>
{% else %}
    <p>wtf</p>
{% endif %}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值