前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django 2.1.7 模板语言 - 变量、标签、过滤器、自定义过滤器、模板注释

Django 2.1.7 模板语言 - 变量、标签、过滤器、自定义过滤器、模板注释

作者头像
Devops海洋的渔夫
发布2019-07-01 15:14:03
7920
发布2019-07-01 15:14:03
举报
文章被收录于专栏:Devops专栏Devops专栏

相关篇章

Django 2.1.7 创建应用模板

Django 2.1.7 配置公共静态文件、公共模板路径

参考文献

https://docs.djangoproject.com/zh-hans/2.1/topics/templates/

模板语言

模板语言包括4种类型,分别是:

  • 变量
  • 标签
  • 过滤器
  • 注释 接下来逐个介绍4种类型。

模板变量

模板变量的作用是计算并输出,变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。

语法如下:

代码语言:javascript
复制
{{变量}}

现在来看看前面篇章中写到的模板遍历代码如下:

代码语言:javascript
复制
{% for value in info.m_query %}
<tr>
       <th scope="row">{{ value.id }}</th>
       <td>{{ info.server_name }}</td>
       <td>{{ value.name }}</td>
       <td>{{ value.port }}</td>
        <td><a href="deleteMiddlewareinfo?id={{ value.id }}" class="btn btn-outline-primary">删除</a></td>
        </tr>
{% endfor %}

当模版引擎遇到点如info.m_query,会按照下列顺序解析:

1.字典info'm_query'

2.先属性后方法,将info当作对象,查找属性m_query,如果没有再查找方法m_query()

3.如果是格式为info.0则解析为列表info0

如果变量不存在则插入空字符串。

在模板中调用方法时不能传递参数。

示例

1)打开assetinfo/views.py文件,创建视图temp_var。

代码语言:javascript
复制
def temp_var(request):
    dict={'title':'字典键值'}
    # 查询所有服务器的信息
    server_list = ServerInfo.objects.all()
    context={'dict':dict,'server_list':server_list}
    return render(request,'assetinfo/temp_var.html',context)

2)打开assetinfo/urls.py文件,配置url。

代码语言:javascript
复制
urlpatterns = [
    # ex:/assetinfo/temp_var
    path('temp_var', views.temp_var),
...
]

3)修改在templates/assetinfo下创建temp_var.html。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    模板变量:<br/>
    {{dict.title}}<br/>
    {% for server in server_list %}
        {{ forloop.counter }} -- {{ server.server_hostname }}<br>
    {% endfor %}

</body>
</html>

4)运行服务器,在浏览器中输入如下网址。

代码语言:javascript
复制
http://127.0.0.1:8000/assetinfo/temp_var

5)浏览效果如下图。

标签

语法如下:

代码语言:javascript
复制
{%代码段%}

for标签语法如下:

代码语言:javascript
复制
{%for item in 列表%}
循环逻辑
{{forloop.counter}}表示当前是第几次循环,从1开始
{%empty%}
列表为空或不存在时执行此逻辑
{%endfor%}

if标签语法如下:

代码语言:javascript
复制
{%if ...%}
逻辑1
{%elif ...%}
逻辑2
{%else%}
逻辑3
{%endif%}

比较运算符如下:

注意:运算符左右两侧不能紧挨变量或常量,必须有空格。

代码语言:javascript
复制
==
!=
<
>
<=
>=

布尔运算符如下:

代码语言:javascript
复制
and
or
not

示例

1)打开assetinfo/views.py文件,创建视图temp_tag。

代码语言:javascript
复制
def temp_tags(request):
    context={'list':ServerInfo.objects.all()}
    return render(request,'assetinfo/temp_tag.html',context)

2)打开assetinfo/urls.py文件,配置url。

代码语言:javascript
复制
urlpatterns = [
# ex:/assetinfo/temp_tags
    path('temp_tags', views.temp_tags),
]

3)在templates/assetinfo下创建temp_tag.html。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {%for item in list%}
            {%if item.id <= 2%}
                <li style="background-color: red;">{{item.server_hostname}}</li>
            {%elif item.id <= 3%}
                <li style="background-color: blue;">{{item.server_hostname}}</li>
            {%else%}
                <li style="background-color: green;">{{item.server_hostname}}</li>
            {%endif%}
        {%empty%}
            <li>对不起,没有服务器</li>
        {%endfor%}
    </ul>
</body>
</html>

4)运行服务器,在浏览器中输入如下网址。

代码语言:javascript
复制
http://127.0.0.1:8000/assetinfo/temp_tags

浏览器显示如下:

过滤器

语法如下:

  • 使用管道符号 | 来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中。
  • 如果过滤器需要参数,则使用冒号:传递参数。
代码语言:javascript
复制
变量|过滤器:参数

长度length,返回字符串包含字符的个数,或列表、元组、字典的元素个数。

默认值default,如果变量不存在时则返回默认值。

代码语言:javascript
复制
data|default:'默认值'

日期date,用于对日期类型的值进行字符串格式化,常用的格式化字符如下:

  • Y表示年,格式为4位,y表示两位的年。
  • m表示月,格式为01,02,12等。
  • d表示日, 格式为01,02等。
  • j表示日,格式为1,2等。
  • H表示时,24进制,h表示12进制的时。
  • i表示分,为0-59。
  • s表示秒,为0-59。
代码语言:javascript
复制
value|date:"Y年m月j日  H时i分s秒"

示例

1)打开assetinfo/views.py文件,创建视图temp_filter。

代码语言:javascript
复制
def temp_filter(request):
    context={'list':ServerInfo.objects.all()}
    return render(request,'assetinfo/temp_filter.html',context)

2)打开assetinfo/urls.py文件,配置url。

代码语言:javascript
复制
urlpatterns = [
    # ex:/assetinfo/temp_filter
    path('temp_filter', views.temp_filter),
]

3)在templates/assetinfo下创建temp_filter.html。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {%for item in list%}
            {%if item.server_hostname|length > 4%}
                <li style="background-color: darkseagreen;">
                    {{item.server_hostname}}
                    ---默认时间格式为:
                    {{item.server_shelves_date}}
                </li>
            {%elif item.server_hostname|length < 2%}
                <li style="background-color: cadetblue;">
                    {{item.server_hostname}}
                    ---默认时间格式为:
                    {{item.server_shelves_date}}
                </li>
            {%else%}
                <li style="background-color: green;">
                    {{item.server_hostname}}
                    ---格式化时间为:
                    {{item.server_shelves_date|date:"Y-m-j"}}
                </li>
            {%endif%}
            {% empty %}
                <li>对不起,没有服务器</li>
        {%endfor%}
    </ul>
</body>
</html>

4)运行服务器,在浏览器中输入如下网址。

代码语言:javascript
复制
http://127.0.0.1:8000/assetinfo/temp_filter

自定义过滤器

过滤器就是python中的函数,注册后就可以在模板中当作过滤器使用,下面以求余为例开发一个自定义过滤器mod。

示例

1)在应用中创建templatetags目录,当前示例为"assetinfo/templatetags",创建init文件,内容为空。

2)在"assetinfo/templatetags"目录下创建filters.py文件,代码如下:

代码语言:javascript
复制
#导入Library类
from django.template import Library

#创建一个Library类对象
register=Library()

#使用装饰器进行注册
@register.filter
#定义求余函数mod,将value对2求余
def mod(value):
    return value%2 == 0

3)在templates/assetinfo/temp_filter.html中,使用自定义过滤器。

  • 首先使用load标签引入模块。
代码语言:javascript
复制
{%load filters%}
  • 在遍历时根据编号判断奇偶,代码改为如下:
代码语言:javascript
复制
{%load filters%}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {%for item in list%}
            {%if item.id|mod == 1%}
                <li style="background-color: darkseagreen;">
                    {{ item.id|mod }}
                    {{item.server_hostname}}
                    ---默认时间格式为:
                    {{item.server_shelves_date}}
                </li>
            {%else%}
                <li style="background-color: #b3d4fc;">
                    {{ item.id|mod }}
                    {{item.server_hostname}}
                    ---格式化时间为:
                    {{item.server_shelves_date|date:"Y-m-j"}}
                </li>
            {%endif%}
            {% empty %}
                <li>对不起,没有服务器</li>
        {%endfor%}
    </ul>
</body>
</html>

4)运行服务器,浏览效果如下:

过滤器可以接收参数,将assetinfo/templatetags/filters.py中增加mod_num函数。

代码语言:javascript
复制
#使用装饰器进行注册
@register.filter
#定义求余函数mod_num,将value对num求余
def mod_num(value,num):
    return value%num

5)在templates/assetinfo/temp_filter.html中修改遍历时判断代码。

代码语言:javascript
复制
{%if item.id|mod_num:3 %}

6)运行服务器,浏览效果如下:

注释

在模板中使用如下模板注释,这段代码不会被编译,不会输出到客户端;html注释只能注释html内容,不能注释模板语言。

1)单行注释语法如下:

代码语言:javascript
复制
{#...#}

注释可以包含任何模版代码,有效的或者无效的都可以。

代码语言:javascript
复制
{# { % if foo % }bar{ % else % } #}

2)多行注释使用comment标签,语法如下:

代码语言:javascript
复制
{%comment%}
...
{%endcomment%}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 相关篇章
  • 参考文献
  • 模板语言
  • 模板变量
    • 示例
    • 标签
      • 示例
      • 过滤器
        • 示例
        • 自定义过滤器
          • 示例
          • 注释
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档