4.模板引擎

1 变量

在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法:

{{var_name}}

demo.py

l=[111,222,333]
dict1={"name":"yuan","age":18}
class Person(object):        
    def __init__(self,name):       
        self.name=name
        person_yuan=Person("yuan")  
        person_egon=Person("egon")
        person_alex=Person("alex")
        person_list=[person_yuan,person_egon,person_alex]

demo.html

{{ l.0 }}
{{ dict.name.upper }}
{{ person_list.0.name }}

注意: 句点符也可以用来引用对象的方法 (无参数方法)

2 过滤器

{{obj|filter__name:param}}
名称含义用法补充
default如果一个变量是 false 或者为空,使用给定的默认值.否则使用变量的值{{ value|default:“no”}}
length返回值的长度,它对字符串和列表都起作用{{ value|length }}如果 value 是 [‘a’, ‘b’, ‘c’, ‘d’],那么输出是 4。
filesizeformat将值格式化为一个"人可读的”文件尺寸{{ value|filesizeformat }}如果 value 是 123456789,输出将会是 117.7 MB
date根据给定的格式设置日期{{ value|date:“Y-m-d” }}
slice对value进行切片操作{{ value|slice:“2:-1” }}
truncatechars如果字符串字符多于指定的字符数量,那么会被截断.截断的字符串将以可翻译的省略号序(“…”)结尾{{ value|truncatechars:9 }}
safe标记一个字符串在输出前不需要进一步的 HTML 转义{{ value|safe }}

3 模板之标签

1.for

遍历每一个元素:

# 正向循环
{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor %}
# 反向循环
{% for obj in list reversed %} 
    <p>{{ person.name }}</p>
{% endfor %}

遍历一个字典:

{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}

注:循环序号可以通过{{ forloop }}显示

变量名描述
forloop.counter循环计数器,表示当前循环的索引(从 1 开始)
forloop.counter0循环计数器,表示当前循环的索引(从 0 开始)
forloop.revcounter反向循环计数器(以最后一次循环为 1,反向计数)
forloop.revcounter0反向循环计数器(以最后一次循环为 0,反向计数)
forloop.first当前循环为首个循环时,该变量为 True
forloop.last当前循环为最后一个循环时,该变量为 True

2.for … empty

for 标签带有一个可选的 {% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作

{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

3.if

{% if %} 会对一个变量求值,如果它的值是 “True”(存在、不为空、且不是 boolean 类型的 false 值),对应的内容块会输出。

{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}

4.with

使用一个简单地名字缓存一个复杂的变量,当你需要使用一个 “昂贵的” 方法(比如访问数据库)很多次的时候是非常有用的

例如:

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

5.csrf_token

这个标签用于跨站请求伪造保护

{% csrf_token %}

6.include

view.py

return render(request,'demo.html',{person:"Jane" greeting:"Hello"})

base.html

{{ greeting }}, {{ person|default:"friend" }}!

demo.html

{% include "base.html" with person=person greeting=greeting %}

7.exclude

1.语法:

{% block 名称 %}
#调用父类
{{ block.super }} 
....
{% endblock 名称 %}  

jinja2中调用父类的方法{{ super() }}

2.例子

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{%/span> endblock %}</title>
</head>

<body>
    <div>
        {% block content %}{% endblock %}
    </div>
</body>
</html>

demo.html

{% extends "base.html" %}
 
{% block title %}{{ block.super }} My amazing blog{% endblock %}

{% block content %}hello{% endblock %}

输出

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>My amazing site My amazing site</title>
</head>

<body>
    <div>
        hello
    </div>
</body>
</html>

8.load

加载一个自定义模板标签集

{% load somelibrary package.otherlibrary %}
{% load foo bar from somelibrary %}

4 自定义标签和过滤器

1.在项目app中创建名为 templatetags的包 (包名只能是 templatetags)

2.在templatetags包中创建任意 .py 文件,如:my_tags.py

注意:

在 settings 中的 INSTALLED_APPS 配置当前 app,不然 django 无法找到自定义的标签

my_tags.py

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

#register的名字是固定的,不可改变 
register = template.Library()   
 
#自定义过滤器 
@register.filter
def filter_multi(v1,v2):
    return  v1 * v2

#自定义标签:方式一    
@register.simple_tag
def my_input(id,arg):
    result = "" %(id,arg,)
    return mark_safe(result)

#自定义标签:方式二
@register.inclusion_tag("base/content_list.html")
def get_content_list(article_list):
    return {"article_list": article_list}

content_list.html

<div class="article_list">
    {% for article in article_list %}
        <div class="article-item clearfix">
            <h5><a href="/blog/{{ article.user.username }}/articles/{{ article.pk }}">{{ article.title }}</a></h5>
            <div class="article-desc">
                {{ article.desc }}
            </div>
            <div class="small pub_info pull-right">
                <span>发布于 &nbsp;&nbsp;{{ article.create_time|date:"Y-m-d H:i" }}</span>&nbsp;&nbsp;
                <span class="glyphicon glyphicon-comment"></span>评论({{ article.comment_count }})&nbsp;&nbsp;
                <span class="glyphicon glyphicon-thumbs-up"></span>点赞({{ article.up_count }})&nbsp;&nbsp;
            </div>
        </div>
        <hr>
    {% endfor %}
</div>

demo.html

# 在使用自定义标签和过滤器的html文件中导入之前创建的my_tags.py
{% load my_tags %} 

# 自定义过滤器
# num=12
{{ num|filter_multi:2 }} 
{{ num|filter_multi:"[22,333,4444]" }}
{% if num|filter_multi:30 > 100 %}
    {{ num|filter_multi:30 }}
{% endif %}
# 自定义标签:方式一
{% simple_tag_multi 2 5 %} 
{% simple_tag_multi num 5 %}
# 自定义标签:方式二
{% get_content_list article_list %}

注意: 自定义过滤器 可以用在 if 等语句后,自定义标签 不可以

5.Jinja2

Jinja2是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,尤其是Flask框架内置的模板语言,jinja2宣称比django默认模板引擎快10-20倍,且对Django的兼容性好

1.jinja2的引用

1.安装

pip install jinja2

2.在Django\mysite\目录下新建jinja2_env.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment


def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    return env

3.编辑Django\mysite\mysite\settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',#修改1
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS':True,
        'OPTIONS':{
            'environment': 'jinja2_env.environment',# 修改2
            'context_processors':[
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

2.自定义过滤器

from jinja2 import Environment

def environment(**options):
    env = Environment(**options)
    # 2.将自定义的过滤器添加到环境中
    env.filters['do_listreverse'] = do_listreverse
    return env

# 1.自定义过滤器
def do_listreverse(li):
    if li == "B":
        return "哈哈"

注意:

1.jinja2不能自定义标签,可以使用宏来实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值