Django模板

news2024/11/24 3:21:24

文章目录

  • 模板Template
  • 实践


模板Template

在Django框架中,模板是可以帮助开发者快速生成呈现给用户页面的工具
模板的设计方式实现了我们MVT中VT的解耦(M: Model,V:View,T:Template),VT有着N:M的关系,一个V可以调用任意T,一个T可以供任意V使用。
	MVC: M: Model,V:View界面,Controller控制器
模板处理分为两个过程
	加载HTML
	渲染数据		render()
模板主要有两个部分
	HTML静态代码
	模板语言,动态插入的代码段(挖坑,填坑)  
		{{ name }} 如果你不给name传值,这个坑就什么都没有
模板中的动态代码段除了做基本的静态填充,还可以实现一些基本的运算,转换和逻辑

静态页面:页面数据是本地固定的
动态页面:页面数据来源于后台服务器

模板中的变量:视图传递给模板的数据,遵守标识符规则
	语法: {{ var }}
	如果变量不存在,则插入空字符串

方法不能有参数,不能带括号()
	{{ str }}
	{{ str.upper }}
	{{ str.isdigit }}
	{{ dict.key }}
列表,使用索引,不允许负索引
	items= ['apples','bananas', 'carrots']
	{{ items.2 }}

模板中的标签
语法 {% tag %]
作用
	1. 加载外部传入的变量
	2. 在输出中创建文本
	3,控制循环或逻辑

if 语句:
	格式:
	if单分支
		{% if 表达式 %}
			语句
		{% endif %}
		
	if双分支
		{% if 表达式 %}
			语句
		{% else %}
			语句
		{% endif %}
		
	if多分支
		{% if 表达式%}
			语句
		{% elif 表达式%}
			语句
		{% else %}
			语句
		{% endif %}
	
	判断true或false
		{% if today_is_weekend %}
			<p>Welcome to the weekend!</p>
		{% endif %}
	
	使用 and or not
		{% if athlete_list and coach_list %}
			<p>Both athletes and coaches are available.</p>
		{% endif %}
		
		{% if not athlete_list %}
			<p>There are no athletes.</p>
		{% endif %}

		(% if athlete_list or coachl_list %}
			<p>There are some athletes or some coaches.</p>
		{% endif %}
	使用 innot in{% if "bc" in "abcdef" %}
			This appears since "bc" is a substring of "abcdef"
		{% endif %}
		{% if user not in users %}
			If users is a list, this will appear if user isn't an element of the list.
		{% endif %}
for 语句
	{% for 变量 in 列表 %}
		语句1
	{% empty %}
		语句2
	{% endfor %}
	当列表为空或不存在时执行empty之后的语句

	{{ forloop.counter}} 表示当前是第几次循环,从1数数
	{% for item in todo_list %}
		<p>{{ forloop.counter }}: {{ item }}</p>
	{% endfor %}
	
	{{ forloop.counter0}}表示当前是第几次循环,从0数数
	{{ forloop.revcounter}}表示当前是第几次循环,倒着数数,到1[[ forloop.revcounter0}}表示当前第几次循环,倒着数,到0[[ forloop.first }} 是否是第一个 布尔值
	
	{% for object in objects %}
		{% if forloop.first %}
			<li class="first">
		{% else %}
			<li>
		{% endif %}
		{{ object }}</li>
	{% endfor %}
	
	{{ forloop.last }} 是否是最后一个 布尔值
	{% for link in links %}
		{[ link }}{% if not forloop.last %} | {% endif %}
	{% endfor %}
	
forloop 表示当前循环
forloop.parentloop 表示当前循环的父循环,
返回值的是{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 3, 
'revcounter0': 2, 'first': True, 'last': False}
	
	{% 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 %}

注释:
	单行注释
	{# 被注释掉的内容 #}

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

过滤器
	{{ var|过滤器 }}
	作用:在变量显示前修改
	
	add {{ value|add:2 }}
	没有减法过滤器,但是加法里可以加负数
		{{ value|add:-2 }}
	lower
		{{ name|lower }}
	upper
		{[ my_list|first|upper }}
	截断:
		{{ bio|truncatechars:30 }}
	过滤器可以传递参数,参数需要使用引号引起来
	比如join: {{ students|join:'=' }}
	
	默认值:default,格式 {{var|default:value}}
	如果变量没有被提供或者为False,空,会使用默认值

	根据指定格式转换日期为字符串,处理时间的
	就是针对date进行的转换
		{{ dateVal | date:'y-m-d' }}

HTML转义
	将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题
	渲染成html:
		{{ code|safe }}
	关闭自动转义
		{% autoescape off %}
			code
		{% endautoescape %}
	打开自动转义转义
		{% autoescape on %}
			code
		{% endautoescape %}

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

实践

新建一个新项目Day02MyDjangoPro02
在这里插入图片描述

根路由Day02MyDjangoPro02\urls.py

from django.contrib import admin
from django.urls import path

from App.views import *

urlpatterns = [

    path("index/", index),
    path("block/", block),
    path("child/", child),

    path('admin/', admin.site.urls),
]

App\views.py

import datetime

from django.shortcuts import render


# 模板
def index(request):
    data = {
        'name': "zhangsan",
        'age': 30,
        'likes': ['game', 'code', 'movie'],
        'address': {
            'province': '广东',
            'city': '珠海'
        },
        'stars': [
            ['辛焱', '大丘丘', '甘雨'],
            ['虎克', '卡芙卡', '白露'],
            ['薛之谦', '周杰伦', '陈奕迅']
        ],
        'dt': datetime.datetime.now(),
        'code': '<b style="color:#8e34e0">I wander in your yard</b>',
        'code2': '''<script>
         var n=3;
         while(n--){
            alert('哈哈哈')
         }
        </script>''',
    }
    return render(request, 'index.html', data)


# 模板继承
# 父模板
def block(request):
    return render(request, 'block.html')


# 子模板
def child(request):
    return render(request, 'child.html')

新建templates\index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django模板</title>
</head>
<body>
<h2>Django模板</h2>
<hr>
    {# 单行注释 #}
    {% comment %}
        多行注释
    {% endcomment %}

    {#  变量  #}
    <p>name:{{ name }}</p>
    <p>age:{{ age }}</p>
    <p>likes:{{ likes }}</p>
    <p>likes.2:{{ likes.2 }}</p>

    <p>address:{{ address }}</p>
    <p>address.city:{{ address.city }}</p>

    <hr>

    {# 标签 #}
    <h3>if语句</h3>
    <h4>单分支</h4>
    {# 注意空格 age >= 18 不然报错 #}
    {% if age >= 18 %}
        <p>{{ name }} 成年啦</p>
    {% endif %}

    <h4>if双分支</h4>
    {% if age >= 18 %}
        <p>{{ name }} 成年啦</p>
    {% else %}
         <p>{{ name }} 未成年</p>
    {% endif %}

    <h4>if多分支</h4>
    {% if age > 60 %}
        <p>{{ name }} 老年人</p>
    {% elif age >= 18 %}
        <p>{{ name }} 壮年</p>
    {% else %}
         <p>{{ name }} 未成年</p>
    {% endif %}


    <h4>结合运算符</h4>
    {% if age >= 18 and age <= 60 %}
         <p>是壮年,风华正茂,小年轻!</p>
    {% endif %}

    {% if age < 18 or age > 60 %}
         <p>未成年或者是老年人!</p>
    {% endif %}

    {% if 'movie' in  likes %}
         <p>{{ name }} 喜欢movie!</p>
    {% endif %}

    <hr>
    <h3>for循环</h3>
    {% for like in likes %}
        <p>{{ like }}</p>
    {% endfor %}


     <h4>empty</h4>
    {# likes2是没有的 #}
    {% for like in likes2 %}
        <p>{{ like }}</p>
    {% empty %}
        <p>当likes2为空或不存在时执行empty之后的语句</p>
    {% endfor %}

    <h4>下标</h4>
    {% for like in likes %}
    <p>
{#        表示当前是第几次循环,从0数数#}
        counter0:{{ forloop.counter0 }}
{#        表示当前是第几次循环,从1数数#}
        counter:{{ forloop.counter }}
{#        表示当前是第几次循环,倒着数数,到1停 #}
        revcounter:{{ forloop.revcounter }}
{#        表示当前第几次循环,倒着数,到0停#}
        revcounter0:{{ forloop.revcounter0 }}

        {% if forloop.first %}
            <b>--first</b>
        {% endif %}

        {% if forloop.last %}
            <b>--last</b>
        {% endif %}
    </p>
    {% endfor %}

    <h4>循环嵌套</h4>
    <table border="1" width="500">
        {% for star in stars %}
            <tr>
                {% for s in star %}
                <td>
                    {{ s }}-( {{ forloop.parentloop.counter }} , {{ forloop.counter }} )
                </td>
                {% endfor %}
            </tr>
        {% endfor %}
    </table>
    <hr>
    <h3>过滤器</h3>
    <p>age = {{ age }}</p>
    <p>age | add:2 = {{ age | add:2 }}</p>
    <p>age | add:-2 = {{ age|add:-2 }}</p>

    <p>name = {{ name }}</p>
    <p>name|first|upper 名字当中第一个字母大写 = {{ name|first|upper }}</p>
    <p>name|last|lower 名字当中最后一个字母小写 = {{ name|last|lower }}</p>
    <p>name|title  "标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写 = {{ name|title }}</p>
    <p>name|truncatechars:4  截断字符串 = {{ name|truncatechars:2 }}</p>

    <p>likes = {{ likes }}</p>
    <p>拼接 likes = {{ likes|join:"+" }}</p>
    <p>likes2 = {{ likes2 }}</p>
    <p>likes2|default:'swim' = {{ likes2|default:'swim' }}</p>

    <p>dt = {{ dt }}</p>
    <p>dt = {{ dt|date:'y-m-d' }}</p>
    <p>dt = {{ dt|date:'Y-m-d' }}</p>

    <p>code={{ code }}</p>
    <p>code|safe={{ code|safe }}</p>
    <p>code2={{ code2 }}</p>
{#    <p>code2|safe={{ code2|safe }}</p> #}

    打开自动转义转义
		{% autoescape on %}
            {{ code }}
		{% endautoescape %}
    关闭自动转义
		{% autoescape off %}
            {{ code }}
		{% endautoescape %}

    <br><br><br><br><br>
    <br><br><br><br><br>
</body>
</html>

练习继承
templates\block.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>父模板</title>
    {#  css  #}
    {% block extcss %}
    {% endblock %}

</head>
<body>

    <h2>父模板</h2>
    <hr>

    {% block head %}
    {% endblock %}
    <hr>

    {% block content %}
        <button>父模板的content中的按钮</button>
    {% endblock %}
    <hr>

    {% block foot %}
    {% endblock %}
    <hr>
    {# js #}
    {% block extjs %}
    {% endblock %}


</body>
</html>

在这里插入图片描述
templates\child_include.html

<ol>
    <li>清风</li>
    <li>Python</li>
    <li>Django</li>
</ol>

templates\child.html

{# 继承父模板 #}
{% extends 'block.html' %}

{% block head %}
<div>
这里是head
</div>
{% endblock %}



{% block content %}
    {#    默认情况下,子模板会覆盖父模板的内容    #}
    {#    如果想将父模板中的block的内容继承,则需要使用block.super    #}
    {{ block.super }}
    <div>
        这里是content
    </div>
{% endblock %}

{% block foot %}
    <div>
    这里是foot
    </div>

    {% include 'child_include.html'  %}
{% endblock %}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/872002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口自动化测试-Requests模块实战详解,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是requests&a…

Postman下载教程

目录 下载 安装 注意事项 看到很多小伙伴在问 Postman 下载的相关问题&#xff0c;花时间整理了下&#xff0c;下面教新入门的小伙伴如何去下载 Postman。 开始前我们可以先了解下&#xff1a;Postman 简介 下载 第一步&#xff1a;进入 Postman 官网 首先&#xff0c;我…

机器学习终极指南:特征工程(02/2) — 第 -2 部分

接上文&#xff1a;机器学习终极指南&#xff1a;特征工程&#xff08;01/2&#xff09; 五、处理不平衡数据 处理不平衡的数据是机器学习的一个重要方面。不平衡数据是指目标变量的分布不均匀&#xff0c;并且与另一个类相比&#xff0c;一个类的代表性不足。这可能导致模型…

NeuS环境配置

TypeError: Descriptors cannot not be created directly. pip install --upgrade protobuf pip install --upgrade tensorboard运行 python exp_runner.py --mode train --conf ./confs/wmask.conf --case bmvs_bearRuntimeError: indices should be either on cpu or on th…

二级考python和c语言哪个好,计算机二级python和c

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;二级python和二级c语言哪个更吃香一些&#xff0c;二级python和二级c语言哪个更吃香一点&#xff0c;今天让我们一起来看看吧&#xff01; 计算机二级貌似只是在校园里的自嗨&#xff0c;出来工作后并没有觉得这个证书有…

分布式事务原子性-TCC

一、分布式事务-原子性 随着数据量不断的变大&#xff0c;单机所能处理的数据总归是有上限的&#xff0c;所以现阶段分布式的应用系统在各个领域中遍地生花。接下来我们就来聊一下分布式系统中非常重 要的特性分布式事务的原子性功能。之前没有了解过分布式相关知识的读者可以…

一文带你迅速了解下Spring中的AOP

1. 什么是AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming)&#xff1a;面向切面编程。 面向切面编程是一种思想&#xff0c;其实就是对某一类事情进行统一的处理。而 SpringAOP就是一种AOP的具体实现的框架。这就好比 IOC 和 DI 一样的关系。 上述就是对登录功…

Excel(1):表头或列头冻结

1.需求 对于较大的excel&#xff0c;通常需要固定一部分内容&#xff0c;另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格&#xff0c;需要注意的是&#xff0c;选择冻结窗格时&#xff0c;窗格的左上方的表格区域是固定不动的&#xff0c;只可以向下或者向右活动。

NPM与外部服务的集成(上)

目录 1、关于访问令牌 1.1 关于传统令牌 1.2 关于粒度访问令牌 2、创建和查看访问令牌 2.1 创建访问令牌 在网站上创建传统令牌 在网站上创建粒度访问令牌 使用CLI创建令牌 CIDR限制令牌错误 查看访问令牌 在网站上查看令牌 在CLI上查看令牌 令牌属性 1、关于访问令…

Ubuntu22关闭中上方弹出的消息提醒,Ubuntu22关闭开机后中上方弹出的消息提醒:logged in as a privileged user

一、问题描述 Ubuntu22关闭中上方弹出的消息提醒&#xff0c;Ubuntu22关闭开机后中上方弹出的消息提醒&#xff1a;logged in as a privileged user 二、问题分析 此弹出框为消息通知提示&#xff0c;关闭相应的消息通知即可 三、解决方案 1、打开设备 2、打开消息通知&…

c语言作业

作业一&#xff1a; 作业二&#xff1a; if语句后可以跟多条语句&#xff0c;用大括号括起来就行。 if语句中0表示假&#xff0c;非0表示真。 if语句是一种分支语句&#xff0c;可以实现单分支&#xff0c;也可以实现多分支。 else语句不一定和它的对齐的if语句相匹配。 …

Android应用开发(37)LTPO帧率测试基于Surfaceview

Android应用开发学习笔记——目录索引 参考android官网&#xff1a; Frame rate | Android media | Android Developers多重刷新率 | Android 开源项目 | Android Open Source ProjectWindowManager.LayoutParams | Android Developers 目前市面上旗舰手机基本都是…

AirServer是什么软件,手机屏幕投屏电脑神器

什么是 AirServer&#xff1f; AirServer 是适用于 Mac 和 PC 的先进的屏幕镜像接收器。 它允许您接收 AirPlay 和 Google Cast 流&#xff0c;类似于 Apple TV 或 Chromecast 设备。AirServer 可以将一个简单的大屏幕或投影仪变成一个通用的屏幕镜像接收器 &#xff0c;是一款…

手势识别rtos小车(2)----蓝牙通信

在pycharm下面安装pybluez库 本人&#xff1a;win11python3.8pybluez2 第一步&#xff0c;直接在pycharm终端运行 pip install pybluez 一般都会直接报错 第二步&#xff0c;下载安装win11的SDK文件&#xff0c;Windows SDK - Windows 应用开发 | Microsoft Developer 第三步…

面试热题(验证二叉搜索树)

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉树 二叉树满足以上3个条件&#xff0c…

SpringMVC关于SSM的整合配置步骤

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 SSM整合 一、创建工程1.1创建Maven工程1.2工程命名1.3检查…

Ubuntu常用配置

文章目录 1. 安装VMware虚拟机软件2. 下载Ubuntu镜像3. 创建Ubuntu虚拟机4. 设置屏幕分辨率5. 更改系统语言为中文6. 切换中文输入法7. 修改系统时间8. 修改锁屏时间9. 通过系统自带的应用商店安装软件10. 安装JDK11. 安装 IntelliJ IDEA12. 将左侧任务栏自动隐藏13. 安装docke…

机器学习终极指南:特征工程(01/2) — 第 -2 部分

西姆兰吉特辛格 一、介绍 欢迎来到“机器学习终极指南”的第二部分。在第一部分中&#xff0c;我们讨论了探索性数据分析 &#xff08;EDA&#xff09;&#xff0c;这是机器学习管道中的关键步骤。在这一部分中&#xff0c;我们将深入研究特征工程&#xff0c;这是机器学习过程…

fiddler抓包工具的用法以及抓取手机报文定位bug

前言&#xff1a; fiddler抓包工具是日常测试中常用的一种bug定位工具 一 抓取https报文步骤 使用方法&#xff1a; 1 首先打开fiddler工具将证书导出 点击TOOLS------Options------Https-----Actions---选中第二个选项 2 把证书导出到桌面后 打开谷歌浏览器 设置---高级…

如何让你的图片服务也有类似OSS的图片处理功能

原文链接 前言 有自己机房的公司一般都有一套存储系统用于存储公司的图片、视频、音频、文件等数据&#xff0c;常见的存储系统有以NAS、FASTDFS为代表的传统文件存储&#xff0c;和以Minio为代表的对象存储系统&#xff0c;随着云服务的兴起很多公司逐渐将数据迁移到以阿里云…