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

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>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38628046/article/details/126395642
今日推荐