03_Django视图

三、Django模板

模板Templates

在Django框架中,模板是可以帮助开发者快速生成呈现给用户页面的工具

模板的设计方式实现了我们MVT中VT的解耦(M:Model,V:View,T:Template),VT有着N:M的关系,一个V可以调用任意T,一个T可以供任意V使用

模板处理分为两个过程

  • 加载HTML
  • 渲染数据 render()

模板主要有两个部分

  • HTML静态代码

  • 模板语言,动态插入的代码段(挖坑,填坑) {{ name }}

  • 模板中的动态代码段除了做基本的静态填充,还可以实现一些基本的运算,转换和逻辑

静态页面: 页面数据是本地固定的

动态页面: 页面数据来源于后台服务器

模板中的变量:视图传递给模板的数据,遵守标识符规则

​ 语法:{{ var }}

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

方法不能有参数

​ {{ str }}

​ {{ str.upper }} # 不能带括号

​ {{ str.isdigit }}

​ {{ dict.key }}

列表,使用索引,不允许使用负索引

​ items = ['apple' 'bananas']

{``{ items.1 }}

  • MVC软件设计模式: Model(数据库),View(界面),Controller(控制器,相当于Django的视图函数)
  • MVT : M:Model(数据库),V:View视图函数,T:Template(界面)

模板中的标签

语法: {``{% tag %}}

作用:

  1. 加载外部传入的变量
  2. 在输出中创建文本
  3. 控制循环或逻辑
django 复制代码
if 语句:

  格式: 
    if单分支
	{% if表达式 %} 语句   {% endif %}

   if双分支
	{% if表达式 %} 语句 {% else %} 语句2  {% endif %}

   if多分支
	{% if表达式 %} 语句 {% elif表达式 %} 语句2 {% else %} 语句3 {% endif %}

判断true或者false(可以使用and or not in,语法与python类似)

	{% if tody_is_weekend %}
		\<p>Welcome to the weekend!!!\</p>
	{% endif %}

使用 in 和 not in
	{% if user in users %}
		\<p>User已经存在</p>
	{% endif %}
django 复制代码
for 语句
	{% for 变量 in 列表	%}
		语句1
	{% empty %}
		语句2
	{% endfor %}
	当列表为空或者不存在的时候,执行empty后的语句

===================forloop.counter示例=================
	{% forloop.counter %} 表示当前是第几次循环,从1开始
{% for item in todo_list %}
	<p> {{forloop.counter}} : {{ item }}	</p>
{% endfor %}

	{{ forloop.counter0 }}表示当前是第几次循环,从0开始
	{{ forloop.revcounter }}表示当前是第几次循环,倒着数数,到1停
	{{ for1oop.revcounter }}表示当前第几次循环,倒着数,到0停
	{{ forloop.first }}是否是第一个 布尔值

{% for object in objects %}
    {% if forloop.first %}
        <li class="first">{{ object }}</li>
    {% else %}
        <li>{{ object }}</li>
    {% endif %}
{% endfor %}

{% for link in links %}
    {{ link }}{% if not forloop.last %}|{% endif %}
{% endfor %}

===================forloop.parentloop示例=================
{% for country in countries %}
<table>
    {% for city in country.city_list %}
    <tr>
        <td>Country #{{ forloop.parentloop.counter }}</td>
        <td>City #{{ forloop.counter }}</td>
        <td>{{ city }}</td>
    </tr>
    {% endfor %}
</table>
{% endfor %}
django 复制代码
注释:
	单行注释
	{# 被注释掉的内容 #}
	多行注释
	{% comment %} 多行内容 {% endcomment %}
django 复制代码
过滤器:
	{{ var|过滤器 }}
	作用: 在变量显示前修改

add:
	{{ value|add:2 }}
	没有减法过滤器,但加法里可以加负数:
	{{ value|add:-2 }}
lower:
	{{ name|lower }}
upper:
	{{ my_list|fisrt|upper }} 将my_list的第一个值变成大写
截断:
	{{ bio|truncatechars:30 }}
	
过滤器可以传递参数,参数需要使用引号引起来,
	比如join:{{ students|join:'=' }}

默认值: default,格式{{ var|default:value }}
	如果变量没有被提供或者为False,空,会使用默认值

根据指定格式转换日期为字符串,处理时间的
	就是针对date进行的转换{{ dateVal | date:'y-m-d'}}
django 复制代码
HTML转义:
	将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题

渲染成html:
	{{ code|safe }}
关闭自动转义 
	{% autoescape off %}
		code
	{% endautoescape %}
打开自动转义转义
	{% autoescape on %}
	code
	{% endautoescape %}
django 复制代码
模板继承:
	block:
		{% block XXX %}
			code
		{% endblock %}

	extends 继承,写在开头位置
		{% extends'父模板路径'%}
	
	include:加载模板进行渲染
		{% include'模板文件'%}
	
	{{ block.super }}:获取父模板中block中的内容

在Django模板中使用jinja2模板引擎

Jinja2是之前我们在Flask框架讲过的一个模板引擎,是模仿Django默认模板引擎基础上开发的,比Django模板引擎性能更好,功能更全.

jinja2宣称比django默认模板引擎快10-20倍。Django也支持jinja2

1.安装jinja2模块
python 复制代码
pip install jinja2
2.在settings.py所在的目录中创建jinja2_env.py文件,并写入以下内容
python 复制代码
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
3.修改项目的settings.py文件

原本的不能删除

python 复制代码
TEMPLATES = [
    # 使用jinja2模板引擎
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # 这里要添加environment变量,指向自定义的jinja2环境,DjangoPro2项目目录下的jinja2_env.py文件里面的environment函数
            "environment": "DjangoPro2.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',
            ],
        },
    },
    # 原来自带的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',
            ],
        },
    },
]
4.在修改Pycharm中settings的模板语言为Jinja2

创建html文件,使用Jinja2语法

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Jinja2模板语言</title>
</head>
<body>
    <h2>Jinja2模板语言</h2>
    <hr>

    <p>name = {{ name }}</p>

    {% for n in name %}
    <b>{{n}}</b>
    {% endfor %}
    <hr>

    {% for n in name %}
    <div>{{loop.index}} : {{n}}</div>
    {% endfor %}

    {# Jinja2是可以使用带括号的函数调用的 #}
    {% for i in range(1, 10) %}
    <div>{{i}}</div>
    {% endfor %}
    
</body>
</html>

注意: 这只是一个简单的Jinja2模板语法示例,要使用更多语法,可以查阅以下资料

相关推荐
MC何失眠1 小时前
vulnhub靶场【哈利波特】三部曲之Fawkes
网络·python·学习·网络安全
Lalolander1 小时前
2024信创数据库TOP30之华为Gauss DB
大数据·数据库·科技·华为·系统架构
被制作时长两年半的个人练习生2 小时前
【pytorch】pytorch的缓存策略——计算机分层理论的另一大例证
人工智能·pytorch·python
卖个几把萌2 小时前
【06】Selenium+Python 定位动态ID
python·selenium·测试工具
天冬忘忧2 小时前
Flink四大基石之CheckPoint(检查点) 的使用详解
大数据·python·flink
Dwlufvex3 小时前
python selenium(4+)+chromedriver最新版 定位爬取嵌套shadow-root(open)中内容
python·selenium
莳花微语3 小时前
Oracle 11G DataGuard GAP 修复过程(通过主库scn增备恢复)
数据库·oracle
petaexpress3 小时前
云原生和数据库哪个好一些?
数据库·云原生·云原生和数据库哪个好·云原生和数据库
黑金IT3 小时前
使用Python和OpenCV自动检测并去除图像中的字幕
开发语言·python·opencv
Cristiano永远是goat3 小时前
数据库原理-期末复习基础知识第二弹
数据库