第六章 深入模板

第六章深入模板

6.1Django模板引擎

Django内置的模板引擎包含模板上下文(模板变量),标签,过滤器

模板上下文(模板变量):变量值有视图函数或视图类传递所得

标签:对变量进行控制输出,例如判断和循环控制等

过滤器:多变量进行操作处理。

6.1.1模板上下文(变量)

{{ variable }}

#variable1='字符串或整型'
#variable2={'name':'字典或实例化对象'}
#variable3=['元组或列表']
<div>{{ variable1 }}</div>
<div>{{ variable2.name }}</div>#属性
<div>{{ variable3.0 }}</div>#索引

6.1.2自定义标签

{% tag%}

Django内置模板标签:

	{% if %}:判断标签,对上下文进行条件判断

	{% for %}:循环标签,遍历输出上下文的内容

 	{% url %}:路由标签,引用路由配置的地址,生成相应的路由地址

 	{% csrf_token%}防跨站请求伪造攻击

 	{% with %}:将上下文重写命名

    {% load %}:加载导入django标签库

    {% static %}:读取静态资源的文件内容

    {% extends xxx%}:继承xxx模板

    {% block xxx %}:重写父类模板的代码
#for 标签
{% for item in mylist %}
{{ item }}
{ % endfor % }

#if 标签
{% if name=='lucy' %}
{{ name }}
{% elif name=='lily' %}
{{ name }}
{% else %}
{{ name }}
{% endif %}

#url 标签
#生成不带变量的URL地址
<a href="{% url 'index' %}">首页</a>
#生成带变量的URL地址
<a href="{% url 'page' 1 %}">第一页</a>

#with 标签
{% with total=number %}
{{ total }}
{% endwith %}

#load 标签
#导入静态文件标签库staticfiles
{% load staticfiles %}

#static 标签
#来自静态文件标签库staticfiles
{% static 'css/index.css' %}

forloop对象的使用

{% for name in name_list %}
{% if forloop.counter==1 %}
<span>这是第一次循环</span>
{% elifforloop.last %}
<span>这是最后一次循环</span>
{% else %}
<span>本次循环次数为:{{ forloop.counter }}</span>
{% endif %}
{% endfor %}

自定义模板标签:

(1)在项目根目录下创建新的文件夹(mydefined)

(2)在该文件夹下创建初始化文件__init__.py和templatetags文件夹。必须以templatetags命名

(3)在templatetags文件夹下创建初始化文件__init__.py和自定义标签文件mytag.py

(4)在配置文件setting.py属性INSTALLED_APPS里添加自定义模板标签的文件夹

INSTALLED_APPS = [
		......
    'django.contrib.staticfiles',
    'index',
    'mydefined',
]

(5)在项目mytag.py文件里自定义标签(reversal)

(6)在模板文件中使用自定义标签

#导入自定义标签文件mytags
{% load mytags %}
<!DOCTYPE html>
<html>
<body>
{% reversal 'Django' %}
</body>
</html>
#页面显示ognajD

6.1.3模板继承

通过模板标签实现,将多个模板文件的共同代码集中在一个新的模板文件中,在各个模板中调用该模板

使用:

(1)在tempaltes 文件夹创建base.html文件,作为公用模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% block title %}
    <title>首页</title>
    {% endblock %}
</head>
<body>
    {% block body %}
    {% endblock %}

</body>
</html>

(2)在其他模板中调用

#声明调用公用模板
{% extends 'base.html' %}

{% block body %}
<a href="{% url 'index:index' %}">首页</a>
<h1>hello django</h1>
{% endblock %}

6.1.4自定义过滤器

{{ variable | filter |lower}}

过滤器支持多个过滤器同时使用

过滤器支持传入参数,过滤器与参数用冒号隔开但不能有空格

{{ variable | date:'D d M y' }}

自定义过滤器:

(1)在项目根目录下创建新的文件夹(mydefined)

(2)在该文件夹下创建初始化文件__init__.py和templatetags文件夹。必须以templatetags命名

(3)在templatetags文件夹下创建初始化文件__init__.py和自定义过滤器文件myfilter.py

(4)在配置文件setting.py属性INSTALLED_APPS里添加自定义模板标签的文件夹

INSTALLED_APPS = [
		......
    'django.contrib.staticfiles',
    'index',
    'mydefined',
]

(5)在项目myfilter.py文件里自定义过滤器(replace)

(6)在模板文件中使用自定义过滤器

#导入自定义过滤器文件myfilter
{% load myfilter %}
<!DOCTYPE html>
<html>
<body>
<div>替换前:{{ value }}</div>
<br>
<div>替换后:{{ value | replace:'python:Django' }}</div>
</body>
</html>
页面显示将python替换为Django

6.2 Jinja2模板引擎

6.2.1安装与配置2

安装

pip install Jinja2

校验(python交互式命令行)

import jinja2

jinja2.version

配置:

(1)在项目文件夹新建jinja2.py文件。(与settings.py在同级目录下)

(2)在jinja2文件中定义函数environment,并在函数里使用jinja2的类Environment进行实例化,实例化对象env用于对接django的运行环境

#jinja2.py
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)将jinja2.py文件定义的函数environment写到配置文件settings.py中。

以下配置模板文件夹templates的所有模板文件都是有jianja2模板引擎执行解析处理

Django内置的功能使用django模板引擎

TEMPLATES = [
    #使用django模板引擎
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
        },
    },
    #使用jinja2模板引擎
    {
            'BACKEND': 'django.template.backends.jinja2.Jinja2',
            'DIRS': [
                os.path.join(BASE_DIR,'templates')
            ],
            'APP_DIRS': True,
            'OPTIONS': {
               'environment':'DjangoTemplateView.jinja2.environment',
            },
        },
]

6.2.2模板语法

jinja2与django的区别在于static函数,url函数,过滤器的使用

#static标签
#Django的用法
{% static 'cat.ico' %}
#jinja2的用法:
{{ static('cat.ico') }} 

#上下文使用
#django的用法
{{ value.name }}
#jinja2的用法
{{ value['name'] }}
 
#使用过滤器
<div>{{ value['name'] | replace('Jinja2','Django') }}</div>

{#for循环#}
{#Django的用法:{% for k,v in value.items %}#}
{% for k,v in value.items() %}
    <div>key is {{ k }}</div>
    <div>value is {{ v }}</div>
{% endfor %}

{#if判断#}
{% if value %}
    <div>This is if</div>
{% else %}
    <div>This is else</div>
{% endif %}

{#url标签#}
{#Django的用法:{% url 'index:index' %}#}
<a href="{{ url('index:index') }}">首页</a>

6.2.3自定义过滤器

在jinja2.py文件里定义函数myReplace,并将函数注册到jinja2的环境函数environment里。完成过滤器的自定义

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


def myReplace(value, old='Jinja2', new='Django'):
    return str(value).replace(old, new)

# 将jinja2模版设置到项目环境
def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    env.filters['myReplace'] = myReplace
    return env

参考书籍《Django web应用开发实战》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值