Django之Django模板与Jinja2模板的使用

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Django之Django模板与Jinja2模板的使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Django模板

Django中的模板是用来渲染HTML页面的工具。

基本特点:

语法简单: Django模板语法精简,十分易学。

变量: 在Django模板中,可以简单地使用变量来引用应用程序中的数据。

例如,可以使用 {{ variable_name }} 来呈现数据。

标签: Django模板中的标记(tag)用于执行诸如循环、条件语句和其他更高级操作等功能。

继承: 使用Django模板,可以轻松地实现一个基本的布局,然后在应用程序中的其他地方重用该布局。

过滤器 : 过滤器(filter)可以在呈现模板之前修改数据。

基本使用

配置模板目录

在工程中创建模板目录templates,接着在settings.py配置文件中修改TEMPLATES配置项的DIRS值,指定模板目录位置。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        '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',
            ],
        },
    },
]

定义模板

templates目录中新建一个模板文件,如index.html。在模板中,使用{{ }}语法访问变量。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>{{ user }}</h3>
    <h3>{{ user.name }}</h3>
    <h3>{{ address }}</h3>
    <h3>{{ address.0 }}</h3>
</body>
</html>

模板渲染

通过loader.get_template(模板文件在模板目录中的相对路径) 找到返回模板对象

使用模板对象.render(context=None, request=None)进行渲染模板,然后返回渲染后的值

from django.http import HttpResponse
from django.template import loader


def index(request):
    # 获取模板
    template = loader.get_template('index.html')
    context = {'user': {'name': '小白', 'age': 20}, 'address': [1, 2, 3]}
    # 渲染模板
    return HttpResponse(template.render(context))

或者使用Django提供的render函数简写,render(request对象, 模板文件路径, 模板数据字典)

from django.shortcuts import render


def index2(request):
    context = {'user': {'name': '小白', 'age': 20}, 'address': [1, 2, 3]}
    return render(request, 'index.html', context)

配置路由

在URLconf中定义一个URL模式,将URL映射到视图函数

urlpatterns = [
    re_path('index/', views.index, name='index'),
]

测试

访问URL,即可看到渲染的index.html模板页面
在这里插入图片描述

模板标签

Django的模板语法是一种简单且易于学习的语言,它使用一些特殊的标记和标签来创建动态HTML页面。

变量

在模板中使用双花括号来访问变量。当模板渲染时,它会将变量替换为其对应的值。

变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。

欢迎您,{{ user.username }}

注释

注释内容不会显示在最终生成的HTML中。注释可用于在模板中添加说明或注释。

单行注释

{# 单行注释 #}

多行注释使用comment标签

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

FOR循环

for循环用于在模板中迭代数据,并将数据渲染到模板中。for循环使用{% %}括起来并包含一个嵌套的{{ }}变量。

    {% for item in address %}{{ forloop.counter }}次循环,值: {{ item }} <br>

    {% empty %}列表为空或不存在时执行
        
    {% endfor %}

IF判断

if语句用于在模板中测试条件,并根据条件显示特定内容。if语句使用{% %}括起来。

{% if user.age == 20 %}
    <a>age is 20</a>
{% elif user.age == 30 %}
    <a>age is 30</a>
{% else %}
    <a>age is null</a>
{% endif %}
{% if user.is_authenticated %}
  您已登录!
{% else %}
  请登录。
{% endif %}

运算符

运算符左右两侧不能紧挨变量或常量,必须有空格。
1.比较运算符

==
!=
<
>
<=
>=

2.布尔运算符

and
or
not

过滤器

过滤器用于修改变量的值,以便在渲染时呈现。它们以管道符号|分隔,并作为变量的后缀。

过滤器用于进行计算、转换操作,可以使用在变量、标签中。如果过滤器需要参数,则使用冒号:传递参数。

模板语法:

{{ 变量名 | 过滤器:可选参数 }}

基本使用:

显示大写的 my_var 值

{{ my_var|upper }} 

过滤管道可以被套接 ,即:一个过滤器管道的输出又可以作为下一个管道的输入

将第一个元素并将其转化为大写

{{ my_list|first|upper }}

有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含

显示变量my_var的前30个词

{{ my_var|truncatewords:"30" }}

其他过滤器:

lower : 大写转换小写

upper : 小写转换大写

title : 可以将字符串中首字母大写

safe : 禁用转义,告诉模板这个变量是安全的,可以解释执行

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

{{ name|length}}

default : 默认值,可以为变量指定一个默认值,以便在变量未定义时显示。

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
value|date:"Y年m月j日  H时i分s秒"

slice : 使用 slice 过滤器可以获取序列(列表,元组等)的一个子序列

{{ some_list|slice:"1:4" }}

join : 使用 join 过滤器可以将列表中的每个元素连接成一个字符串。

{{ some_list|join:" / " }}

继承和区块

继承和区块用于在不同的模板之间共享代码和结构。基本的继承语法使用{% extends %},而区块语法使用{% block %}和{% endblock %}。

父模板

如果发现在多个模板中某些内容相同,那么这些内容就可以定义到父模板中。

使用标签block进行定义,用于在父模板中预留区域,留给子模板填充差异性的内容。 为了可读性,建议给endblock标签写上名字,名字不能相同。父模板中也可以使用上下文中传递过来的数据。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% block header %}
    <div>预留区域,可以是默认内容,也可以没有内容</div>
{% endblock header %}

{% block foot %}
    <div>脚部默认区域</div>
{% endblock foot %}
</body>
</html>

子模板

子模板使用标签extends,写在子模板文件的第一行。子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。

{% extends 'user/test.html' %}


{% block header %}
    {{ block.super }}
{% endblock header %}


{% block foot %}
    填充脚部区域
{% endblock foot %}

Jinja2模板

Jinja2是一个基于Python的、功能强大的Web模板引擎,其提供了许多有用的功能,如继承、条件渲染、迭代、宏、自动转义以及过滤器等。

django默认模板引擎功能不齐全,速度慢,jinja2宣称比django默认模板引擎快10-20倍。Django也支持jinja2。

安装jinja2模块

pip install jinja2

Jinja2模板引擎环境配置文件

在项目中创建 jinja2_env.py模板引擎环境配置文件

from django.templatetags.static import static
from django.urls import reverse

from jinja2 import Environment


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

    return env

配置Jinja2模板引擎

在settings.py文件中配置Jinja2模板引擎,接着指定Jinja2模板引擎环境

TEMPLATES = [
    {
    	# 1.将django模板引擎修改为jinja2
        # 'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
        	# 2.指定修改过的环境变量
        	# 'environment': 'jinja2.Environment',# 默认存在
            'environment': 'demo.jinja2_env.environment',
            '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模板

定义一个视图

from django.http import HttpResponse
from django.template import loader


def index1(request):
    # 获取模板
    template = loader.get_template('user/index.html')
    context = {'user': {'name': '小白', 'age': 20}}
    # 渲染模板
    return HttpResponse(template.render(context))

Jinja2模板的模板语法与Django自带的模板使用语法类似。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ user.name }}
<br>
{{ user.age }}
</body>
</html>

在这里插入图片描述

Jinja2过滤器

Jinja2提供了大量的过滤器来处理和转换模板变量

safe过滤器可以标记内容是安全的,即内容不应被转义或修改。

{{ var|safe }}

capitalize过滤器可以将文本的第一个字符大写。

{{ var|capitalize }}

lower过滤器可以将文本全部转换为小写。

{{ var|lower }}

upper过滤器可以将文本全部转换为大写。

{{ var|upper }}

title过滤器可以将单词的首字母转换为大写,而其他字符转换为小写。

{{ var|title }}

truncate过滤器可以将文本截断为指定长度,并在末尾添加省略号。

{{ var|truncate(20) }}

escape过滤器可以实现HTML、XML和URL的转义。

{{ var|escape }}

join过滤器可以将列表中的元素连接起来。

{{ var|join(', ') }}

default过滤器可以在值为空或不存在时提供一个默认值,避免出现模板错误。

{{ var|default('no value') }}

dictsort过滤器可以按字典顺序排序列表中的字典,也可以反转顺序。

{{ var|dictsort }}

自定义过滤器

Jinja2提供了一些内建的过滤器,同时也可以自定义过滤器

在jinja2_env.py文件中自定义过滤器

from jinja2 import Environment

def environment(**options):
	# 创建env实例
    env = Environment(**options)

    # 将自定义的过滤器添加到环境中
    # myFilterFun是过滤器函数,myFilter是过滤器名称 
    env.filters['myFilterFun'] = myFilter

    return env

# 自定义过滤器
def myFilter(val):
    if val == "Python":
        return "OK"
    else:
        return val

注释使用django原模板的admin应用及路由,否则将出现如下异常:

ERRORS:
?: (admin.E403) A 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use the admin application.
INSTALLED_APPS = [
    # 'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 添加注册子应用
    'user.apps.UserConfig',
]
from django.urls import include, path

urlpatterns = [
    # path('admin/', admin.site.urls),
    # 配置只要是/user路径则匹配成功
    # path('user/', include('user.urls')),
    path('user/', include(('user.urls', 'user'), namespace='user'))
]

使用过滤器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ "Python" | myFilterFun }}
<br>
{{ "Java" | myFilterFun }}
</body>
</html>

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136839.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!